【发布时间】:2019-05-03 11:47:46
【问题描述】:
问题
我正在寻找在父子类中定义变量的最佳方法,以便通过指向其父类的指针调用。
这是协议代码:
class Base {
public:
virtual void function() = 0;
};
class A : public Base {
public:
int a, b;
A(int a_, int b_) : a(a_), b(b_) {};
void function() { // do something.. }
};
class B : public Base {
public:
int a, b;
B(int a_, int b_) : a(a_), b(b_) {};
void function() { // do something.. }
};
Base* elements[2] = {
new A(1,2),
new B(3,4)
};
由于我在两个构造函数中都定义了a, b,我可以在抽象类Base 中定义它们。这样代码应该更高效、更干净。这种做法正确吗?我应该如何定义它们?
可能的解决方案
我想到的解决方案是实现一个函数,例如返回 a,如下所示:
class Base {
public:
virtual int return_a() = 0;
};
class A : public Base {
public:
int a, b;
A(int a_, int b_) : a(a_), b(b_) {};
int return_a() {
return a;
}
};
int main(){
int a = elements[0]->return_a();
}
这可行,但我确信这不是一种有效的方法。在抽象类中定义a, b 更好吗?谢谢
【问题讨论】:
-
如果
Base的所有 个子级具有这些a和b成员,那么在Base类中定义它们似乎是一个自然的解决方案。如果只有 一些 孩子使用a和b,那么您可以添加一个中间类,例如struct SubBase : public Base { int a; int b; };然后让你的A和B类继承自该类。 -
由于您显示的所有成员都是公开的,因此您可以改用
struct(与class相同,但默认可见性为public而不是private)。如果a和b成员是公开的,则您不需要为它们提供任何“getter”函数。 -
公共派生方法可以直接访问公共 Base 属性。不需要'Base::return_x()'。
标签: c++ class variables inheritance parent-child