与继承函数混淆
Confused with inherited functions
修正:
3rd code piece, 1st line:
static void writeFile(User &user)
用户类:
User class:
void print() made public
现在它可以正常工作了。感谢所有帮助过我的人。
这是原文:
1. class User {
2. protected:
3. string name;
4. string surname;
5. .
6. .
7. .
8. void print() {
9. cout << name << " " <<surname; //etc
10. }
11. }
继承的类:
1. class DiscountUser : public User {
2. public:
3. void print() {
4. cout << "Discount ";
5. User::print();
6. }
7. }
之后在另一节课中我有:
1. void writeFile(User user) {
2. user.print();
3. }
在另一个中:
1. User *user = NULL;
2.
3. if (userType == "Discount") {
4. user = new DiscountUser(name, surname, code);
5. }
6. else {
7. user = new BonusUser(name, surname, code);
8. }
9. writeFile(*user);
我得到一个错误C2248: 'User::print':不能访问在'User'类中声明的受保护成员。
我知道我得到它,因为它试图访问父类中的print()。是因为第三段代码的第一行还是我真的把第四段代码的指针搞砸了?还是因为我是个彻头彻尾的失败者,我错过了一些明显的东西?
编译器通过查看指针的类型来知道应用哪些访问规则。因为指针是User *
,而print
在该类中是受保护的,所以不能访问它。
作为一般规则,您应该保持基类和派生类之间的访问级别相同。
除了编译错误之外,您还会遇到一个错误,因为writeFile
是通过值而不是通过引用获取对象。当为函数调用复制参数时,您将获得"切片",其中对象的类型被转换回基类。
除了其他回答中讨论的问题外,您还没有在User::print
上使用virtual
关键字。这意味着即使一切都是公共的,从User*
变量调用它总是调用基方法,即使变量包含派生对象。
回顾原来的问题,我想知道你想做的是在User
中有一个公共纯虚拟print
方法和一个受保护的非虚拟printImpl
方法,从DiscountUser::print
调用。
在c++中,访问由变量的静态类型决定,而不是动态类型。既然writeFile
的参数静态类型是User
, print
是protected
,那么不管user
的动态类型是什么,
同样,你应该通过引用(或指针)传递User
对象,而不是值。否则你会得到所谓的"切片",即只复制对象的基本部分,这真的会让你头疼。
相关文章:
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承