所以我一直在尝试使用基类的派生类数据成员,但我不知道该怎么做。我看到一种执行此操作的方法,就是在调用基类方法时仅在参数中传递我需要的成员,但是我只是认为应该有另一种方法来执行此操作。所以我将其复制如下。
#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
每种方法都会受到赞赏,无论哪种方法更好,如果您想在评论中添加一些内容或要求,我会立即进行。
答案 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
。这是因为,如果您声明一个与基类中的成员变量同名的新成员变量,则可以有效地创建一个与父类中的成员变量无关的全新成员变量。对于简单的示例,您展示了无需“覆盖”成员变量,因为它已经存在于所有子类中。