【问题标题】:Multilevel inheritance member accessing多级继承成员访问
【发布时间】:2016-03-24 08:54:19
【问题描述】:

我正在学习OOP,似乎遇到了问题。
代码:

class line {
protected:
    double a;
public:

    line() {a = 1;}
    line(double var1) {a = var1;}
};

class rectangle: private line {
protected:
    double b;
public:
    double area() {return a * b;}

    rectangle():line() {b = 1;}
    rectangle(double var1):line(var1) {b = var1;}
    rectangle(double var1, double var2):line(var1) {b = var2;}
};

class parallelepiped: private rectangle{
private:
    double c;
public:
    double volume() {return area() * c;}
    void print() {  cout << "Parallelepiped rectangle information:" << endl;
                    cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
                    cout << "Volume: " << volume() << endl << endl;}

    parallelepiped():rectangle() {c = 1;}
    parallelepiped(double var1):rectangle(var1) {c = var1;}
    parallelepiped(double var1, double var2):rectangle(var1) {c = var2;}
    parallelepiped(double var1, double var2, double var3):rectangle(var1, var2) {c = var3;}
};

问题:错误:'double line::a' 在 print() 中受到保护。
有什么方法可以打印出'a',以及给学习者的一般提示吗?

【问题讨论】:

  • 你在学习普通的 OOP 还是 C++?基于此,我可以提供一些建议。
  • using line::a; 在类rectangle 的范围内,或者根本不使用private 继承
  • 为什么要使用私有继承?
  • 除了其他 cmets,您可能还想阅读stackoverflow.com/questions/860339/…
  • 您误解了私有继承的工作原理:阅读此stackoverflow.com/a/1372858/2214693

标签: c++ c++11 inheritance


【解决方案1】:

在 C++ 中学习 OOP 时,您不需要使用私有继承。在某些情况下,私有或受保护的继承是好的设计决策,但在刚开始时并非如此。

如果你想从超类访问成员,你应该使用公共继承

class rectangle: public line {};
class parallelepiped: public rectangle {};

这是关于私有公共继承和受保护继承之间差异的 SO 解释:

Difference between private, public, and protected inheritance

【讨论】:

  • 为什么矩形应该是线条的子类?矩形不是一条线。它是由行组成的,但那是组合而不是继承。
【解决方案2】:

在大多数情况下,不需要使用私有继承。 当您想向用户隐藏您从其他类继承的某些方法时,您只想使用私有继承。

请在这里找到一个很好的解释: When should I use C++ private inheritance?

作为初学者,我敢肯定你在不久的将来不会需要这个。

【讨论】:

    【解决方案3】:

    private 成员,在当前类和朋友类中可用,在派生类中不可用。

    class rectangle: private line改为class rectangle: public line时,打印'a'就可以了。

    小心使用私有继承。

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多