C++中的多态性(意外行为)
Polymorphism in C++ (unexpected behaviour)
我有以下三个类:
class A
{
private:
std::string device;
public:
std::string getDeviceType() { return device; };
void setDeviceType(std::string device) { device = device; };
virtual void doSomething() = 0;
virtual void doSomething2() = 0;
};
class B: public A
{
private:
public:
B(){ ; };
virtual ~B(){ ; };
void doSomething() { std::cout << "I am usual B" << std::endl; };
void virtual doSomething2() { std::cout << "I am usual B" << std::endl; };
};
class C : public B
{
private:
public:
C(){ ; };
~C(){ ; };
void doSomething() { std::cout << "I am C" << std::endl; };
void doSomething2() { std::cout << "I am C" << std::endl; };
};
主要:
B *myHandler = new C();
myHandler->doSomething();
myHandler->doSomething2();
但是输出不如预期,我预期的输出是I am usual B
然后I am C
,因为doSomething()
是类B
的非虚拟成员。但真正的输出是I am C
然后I am C
.你知道为什么吗?
因为doSomething((是类B的非虚拟成员
这就是你错的地方。 在A
中,您将doSomething()
声明为virtual
. 这意味着它在派生自它的类中隐式标记为虚拟。 所以doSomething()
B
是virtual
这意味着你会称C
doSomething()
。
原因是doSomething
在类A
中被标记为虚拟。因此,它在类B
和C
中保持虚拟,因为它们继承自类A
。
由于此函数是虚拟的,因此根据对象的实际类型调用它,这在您的情况下是C
,您将获得输出:I am C
。
一旦标记为虚拟,它在所有派生类中都保持虚拟状态。
在 C 语言中,你覆盖了 doSomething(( 和 doSomething2((。你实例化 C,所以在这两种情况下都会调用 C 的方法。
如果你省略了 doSomething(( 在 C 中的覆盖,输出将符合你的预期。
氪, 梅勒
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- C++中的多态性(意外行为)
- c++11在使用std::thread时的意外多态性行为