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\nstruct 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}\nRun Code Online (Sandbox Code Playgroud)\n
首先,你是对的,不实现fooinA会使A抽象,不实现fooinB也会使该抽象。
多态性的整体意义是为一组类提供一个公共接口。一般而言,任何派生类型都可以充当基本类型,具体行为仅在细节上有所不同(例如,像汽车、自行车或轮船中的转向,机制不同,但您可以驾驶所有这些)。
foo如果打电话没有意义B,请先问“为什么?” !不知何故,这B不可能是真的A,就像螺丝刀不可能是锤子一样(但两者都可以是工具)。
如果您发现自己遇到这样的麻烦,那么很可能您的设计有缺陷。