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



,所以我一直在尝试使用基类派生的类数据成员,但我无法弄清楚如何做到这一点。我看到了一种方法,就像在调用基类方法时所需的参数成员一样,但是我只是想应该有另一种方法可以做到这一点。所以我已经在下面复制了此。

#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

每种方法都将不胜感激,无论如何,如果您想在评论中添加任何东西或任何东西,我会立即做。

定义一个虚拟getter,例如

virtual int getCord() const { return cord; }

在每个类中

void display(){ cout << getCord() <<endl; }

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

A a;
a.display();

仅由

display();

否则您没有机会在A

的实例上明确访问子类的值

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

这是因为我让B和C中的 cord 重新定义,但我不建议您在"真实"代码中进行此类重新定义; - (

让我们以B构造函数:

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

在其中创建一个完全独立的对象a类型A,然后在其上调用display。该display调用将使用a对象,对B类或其完全独立的cord成员变量一无所知。

解决此问题的一种可能方法是创建A的构造函数,该构造函数将cord作为参数的值,传递B构造函数初始化器列表中的"正确"值,然后在上调用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类(或结构(做类似的操作。

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

最新更新