C++ 中的多态性(意外行为)
Polymorphism in C++ (unexpected behaviour)
我有以下三个 classes:
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()
是class[=15=的非虚拟成员].但真正的输出是I am C
,然后是I am C
。你知道为什么吗?
because of doSomething() is non virtual member of class B
这就是你弄错的地方。在 A
中,您将 doSomething()
声明为 virtual
。这意味着它是 implicitly marked virtual in classes that derive from it。所以 B
中的 doSomething()
是 virtual
这意味着你将调用 C
的 doSomething()
.
原因是doSomething
在classA
中被标记为虚拟。所以它在 classes B
和 C
中仍然是 virtual 因为它们继承自 class A
.
由于这个函数是virtual,根据对象的真实类型调用它,在你的例子中是C
,你得到输出: I am C
.
一旦标记为虚拟,它在所有派生中都保持虚拟 类。
在 C 中,您覆盖了 doSomething() 和 doSomething2()。你实例化了C,所以C的方法在这两种情况下都会被调用。
如果您在 C 中省略了 doSomething() 的重写,输出将如您所愿。
韩国,
梅勒
我有以下三个 classes:
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()
是class[=15=的非虚拟成员].但真正的输出是I am C
,然后是I am C
。你知道为什么吗?
because of doSomething() is non virtual member of class B
这就是你弄错的地方。在 A
中,您将 doSomething()
声明为 virtual
。这意味着它是 implicitly marked virtual in classes that derive from it。所以 B
中的 doSomething()
是 virtual
这意味着你将调用 C
的 doSomething()
.
原因是doSomething
在classA
中被标记为虚拟。所以它在 classes B
和 C
中仍然是 virtual 因为它们继承自 class A
.
由于这个函数是virtual,根据对象的真实类型调用它,在你的例子中是C
,你得到输出: I am C
.
一旦标记为虚拟,它在所有派生中都保持虚拟 类。
在 C 中,您覆盖了 doSomething() 和 doSomething2()。你实例化了C,所以C的方法在这两种情况下都会被调用。
如果您在 C 中省略了 doSomething() 的重写,输出将如您所愿。
韩国, 梅勒