【发布时间】:2015-04-30 13:21:23
【问题描述】:
当我运行这段代码时,由于我们在基类中使用了虚函数,所以由于后期绑定,输出如预期的那样“这是派生的 2”。
#include <iostream>
using namespace std;
class Base {
public :
virtual void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
void show() {
cout<<"This is derived class"<<endl;
}
};
class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};
int main() {
Base *obj = new D2();
obj->show();
return 0;
}
同样,如果我将代码更改为
#include <iostream>
using namespace std;
class Base {
public :
void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
virtual void show() {
cout<<"This is derived class"<<endl;
}
};
class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};
int main() {
// your code goes here
Derived *obj = new D2();
obj->show();
return 0;
}
同样的事情发生了,虚函数是在基类中定义的,在这种情况下是“派生”类,而指针也是“派生”类型,所以再次调用 show() 给了我最派生的版本。
但我无法理解在“派生”类中定义虚函数并且我使用“基”类的基指针时发生了什么。以下代码的输出
#include <iostream>
using namespace std;
class Base {
public :
void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
virtual void show() {
cout<<"This is derived class"<<endl;
}
};
class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};
int main() {
// your code goes here
Base *obj = new D2();
obj->show();
return 0;
}
输出:“这是基类”。请帮助我理解这个输出。
【问题讨论】:
-
你有一个基类指针,在基类
show不是虚拟的。所以它当然是调用基类一。 -
@Borgleader 是的,但是我已经在 Derived 类中定义了虚函数,并且 D2 是从 Derived 派生的。它不应该从 D2 调用 show 吗?
-
否,因为指针的静态类型是 Base 并且在 base 中函数不是虚拟的,所以它知道它可以在编译时解析调用,指针指向的对象的运行时类型确实没关系。
-
不清楚您的问题/问题是什么。输出正是人们所期望的。也许您应该阅读
virtual函数和多态性的工作原理。您不能从派生的基础中继承。virtual函数不会覆盖基中匹配的virtual函数,只会影响Derived*的使用。
标签: c++ oop polymorphism virtual-functions