gpt4 book ai didi

c++ - C++ 中的继承 : define variables in parent-child classes

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:10 30 4
gpt4 key购买 nike

问题

我正在寻找在父子类中定义变量的最佳方法,以便通过指向其父类的指针进行调用。
这是协议(protocol):

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是不是更好?谢谢

最佳答案

Is this practice correct?

我认为这正在变成基于意见的问答。如果您的所有派生类都必须包含成员 ab那么在我看来,它们应该是基类的一部分。这样,您可以保证所有派生类都将包含成员 ab,并且您(或其他人)不会冒忘记包含它们的风险.此外,通过在基类中包含成员,您不必在每个派生类中都包含它们,从而节省了内存。 C++ 的 virtual 为您提供了实现多态性所需的所有工具,当您创建一个 Base * 数组时就会发生这种情况。

我还建议您对在派生类中被覆盖的虚函数使用关键字override,对派生类中不需要的使用关键字final成为基类。您可以从 Scott Meyers 现代 C++ 书中阅读使用这些关键字的好处。

struct Base
{
int a, b;

Base(int a_, int b_) : a(a_) , b(b_)
{;}

virtual void function() = 0;
};

struct A : Base // A can be a base class of another class.
{
A(int a_, int b_) : Base(a_,b_)
{;}

void funtion() // this will compile, but it's not going to override the Base::function()
{;}
};

struct B final : Base // B can never become a base class.
{
B(int a_, int b_) : Base(a_,b_)
{;}

void funtion() override // this won't compile because override will see that we mis-spelled function()
{;}
};

但是,没有 C++ 规则禁止您在所有派生类中包含成员。

此外,如果您的所有成员都是public,那么您可以使用struct 来避免在类中和在继承方式。

struct Base
{
// all members are public
};

struct Derived : Base // public inheritance by default.
{
// all members are public
};

关于c++ - C++ 中的继承 : define variables in parent-child classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55969205/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com