使用来自基类方法的派生类数据成员

时间:2019-05-15 11:45:09

标签: c++ inheritance

所以我一直在尝试使用基类的派生类数据成员,但我不知道该怎么做。我看到一种执行此操作的方法,就是在调用基类方法时仅在参数中传递我需要的成员,但是我只是认为应该有另一种方法来执行此操作。所以我将其复制如下。

#include<iostream>
using namespace std;
class B;
class A{
    public:
    display(){
        cout<<cord<<endl;
    }
    int cord = 25;
};

class B : public A{
    public:
    B(){
        A a;
        a.display();
    }
    int cord = 30;
};

class C : public A{
    public:
    C(){
        A a;
        a.display();
    }
    int cord = 35;
};

int main(){
    B b;
    C c;
    B.display();

}

上面的代码将输出显示为

25
25
25

我希望它给出的是

30
35
30

每种方法都会受到赞赏,无论哪种方法更好,如果您想在评论中添加一些内容或要求,我会立即进行。

2 个答案:

答案 0 :(得分:3)

定义虚拟吸气剂,如

virtual int getCord() const { return cord; }
在每个课程中

并在 display

中调用它
void display(){ cout << getCord() <<endl; }

在B和C的构造函数中,您还需要替换

A a;
a.display();

就在

display();

否则,您将没有机会访问在A实例上显式调用display的子类的值


  

使用基类方法的派生类数据成员

这是因为我允许在B和C中重新定义 cord ,但是我不建议您在“真实”代码中进行这种重新定义;-)

答案 1 :(得分:2)

让我们使用B构造函数:

B(){
    A a;
    a.display();
}

在其中创建类型为a的完全独立的对象A,然后在其上调用display。该display调用将使用a对象,完全不了解B类或其完全独立的cord成员变量。

解决此问题的一种可能方法是创建A的构造函数,该构造函数将cord的值作为参数,并在B构造函数的初始值设定项列表中传递“正确”的值,然后在 this 对象上调用display函数:

struct A{
    A() = default;

    explicit A(int c)
        : cord(c)
    {
    }

    display(){
        cout<<cord<<endl;
    }

    int cord = 25;
};

struct B : A{
    B()
        : A(30)
    {
        display();  // Equivalent to this->display();
    }
};

当然,您需要为C类(或结构)做类似的事情。

请注意,我从cord类中删除了成员变量B。这是因为,如果您声明一个与基类中的成员变量同名的新成员变量,则可以有效地创建一个与父类中的成员变量无关的全新成员变量。对于简单的示例,您展示了无需“覆盖”成员变量,因为它已经存在于所有子类中。