gpt4 book ai didi

c++ - 基类是否可能具有派生类中没有的函数?

转载 作者:行者123 更新时间:2023-11-30 05:42:57 25 4
gpt4 key购买 nike

假设你有一个具有多个函数的基类,比如

virtual int func1();
virtual int func2();
virtual int func3();
virtual int func4();

等等

并且您想要有两个子类,Child1 和 Child2。 Child1 是否可以包含 func1() 和 func2() 但不能包含 func3() 或 func4(),而 Child2 是否包含 func3() 和 func4() 但不能包含 func1() 或 func2()?

所以 Child1 将包含:

int func1()
int func2()

Child2 将包含:

int func3()
int func4()

我问这个问题是因为我正在尝试做这样的事情,但是当我尝试运行它时,到处都是 undefined reference 错误。例如,会出现如下错误:

/tmp/cczUiDZ2.o:(.rodata._ZTV5Child1[_ZTV5Child1]+0x38): undefined reference to `Parent::func3()'

最佳答案

Say you have a base class with multiple functions, like

virtual int func1();
virtual int func2();
virtual int func3();
virtual int func4();

即使不提及派生类,也已经存在潜在问题。您已经声明了 Base::func1() 等,但是您还没有定义这些函数。这就是链接器错误所提示的。

如果在基类级别定义这些函数没有意义,您需要通过在终止函数声明的分号之前插入 = 0 来将这些函数声明为“纯虚拟” :

class Base {
public:
virtual int func1() = 0;
virtual int func2() = 0;
virtual int func3() = 0;
virtual int func4() = 0;
...
};

(注意:我特意公开了那些纯虚函数。我稍后再讲。)

这样做的目的是说这些函数可以用在派生自基类的任何类上,但与此同时,将这些函数定义在基类水平。如果这样做,这些函数必须在子类中定义(或在子子类中,或子-...-子子类)。具有未定义的纯虚函数的类不可实例化。

如果您希望 Child1 拥有函数 func1()func2(),但没有 func3()func4()?这些函数可以在基类级别调用,但不能在子类级别调用。这违反了 Liskov substitution principle .这是一个非常明显的迹象,表明您的设计有误。

另一种方法是在基类级别(有意义的地方)提供默认实现,并在子类级别(有意义的地方)覆盖它们。您的 Child1 可以提供 func1()func2() 的类特定定义,以覆盖基类中提供的默认值。

另一种选择是使用多重继承。多重继承会给您带来很大的麻烦,但只要处理得当,多重继承就没有错。

另一种选择是做一些颠覆但不违反 Liskov 替换的事情。例如,在 Child1 中实现了 func3()func4(),但在这些实现中总是抛出异常。不要这样做。

关于c++ - 基类是否可能具有派生类中没有的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418169/

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