C++中如何防止派生类成为抽象类?

Jer*_*emy 1 c++ polymorphism inheritance abstract-class

我有一个关于多态性的问题。以下示例将导致错误“无法将变量 \xe2\x80\x98obj\xe2\x80\x99 声明为抽象类型 \xe2\x80\x98B\xe2\x80\x99”

\n\n

我知道问题在于函数 A::foo() 的纯虚方法,这使得 A 成为一个抽象类。此外,类 B 是类 A 固有的。如果我没有在 B 的主体中实现方法 foo(),是否也必然使 B 成为抽象?并因此导致错误?但这的逻辑是什么?我的基类 A 可能还有很多其他派生类,函数 foo 可能适用于某些派生类,但对于 B 类可能完全没用。当然我可以声明一个空函数 B::foo() ,这绝对是不执行任何操作并使代码运行。但是,对于这种行为有更好的解决方案或解释吗?谢谢!

\n\n
struct A\n{\n    A() : x(0)  {}\n    virtual int foo() const = 0;   // if I remove this line, code will run with no problem.\n    int x;\n};\n\nstruct B :  A {};\n\nint main()\n{\n    B obj;\n    cout << obj.x << endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Aco*_*gua 5

首先,你是对的,不实现fooinA会使A抽象,不实现fooinB也会使该抽象。

多态性的整体意义是为一组类提供一个公共接口。一般而言,任何派生类型都可以充当基本类型,具体行为仅在细节上有所不同(例如,像汽车、自行车或轮船中的转向,机制不同,但您可以驾驶所有这些)。

foo如果打电话没有意义B,请先问“为什么?” !不知何故,这B不可能是真的A,就像螺丝刀不可能是锤子一样(但两者都可以是工具)。

如果您发现自己遇到这样的麻烦,那么很可能您的设计有缺陷。