,所以我一直在尝试使用基类派生的类数据成员,但我无法弄清楚如何做到这一点。我看到了一种方法,就像在调用基类方法时所需的参数成员一样,但是我只是想应该有另一种方法可以做到这一点。所以我已经在下面复制了此。
#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
。这是因为,如果您声明了一个与基类中成员变量相同名称的新成员变量,则有效地创建一个与父类中的成员变量无关的全新成员变量。对于简单的示例,您显示的是不需要"覆盖"成员变量,因为它也已经存在于所有子类中。