与继承函数混淆

Confused with inherited functions

本文关键字:函数 继承      更新时间:2023-10-16

修正:

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, printprotected,那么不管user的动态类型是什么,

同样,你应该通过引用(或指针)传递User对象,而不是值。否则你会得到所谓的"切片",即只复制对象的基本部分,这真的会让你头疼。