【发布时间】:2020-06-22 18:24:05
【问题描述】:
所以我是学习虚拟函数的新手,我正在关注在线教程,但我似乎无法找到我的问题的答案。我想问为什么通过设置基类对象指向派生类对象来使用下面的虚函数,比只使用派生类对象本身来访问函数更好?
似乎无论哪种方式我都得到相同的输出,而且创建基类对象和虚函数似乎是额外的步骤。我在一个在线教程中看到了一个与此类似的示例,它声称虚拟函数使编码更容易,但我不太明白这个示例的好处?
我在网上看到:
虚函数的主要优点是它们直接支持面向对象的编程。当您将函数声明为虚拟函数时,您是在说执行的代码具体取决于您调用它的对象的类型。
但是使用派生对象似乎已经是这种情况,并且没有必要创建基类对象?我确定我遗漏了一些明显的东西,所以我非常感谢任何帮助。我展示了我在下面编写的示例代码,它与我在详细介绍虚拟函数时看到的类似:
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////
//base class
class Shape {
public:
virtual void draw()=0; //pure virtual function
};
//derived classes
class Square : public Shape {
public:
void draw() {
cout << "Draw square" << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Draw circle " << endl;
}
};
//////////////////////////////////////////////////////
int main()
{
Square so; //create derived class objects
Circle co;
Shape* shape1 = &so; //setting base class objects as pointers to derived objects
Shape* shape2 = &co;
shape1->draw(); //using base class objects to access derived class
shape2->draw();
so.draw(); //using derived class objects
co.draw();
}
【问题讨论】:
-
给定
Shape *create(),create()->draw()会输出什么?假设create来自运行时加载的外部DLL。 -
继承自具有虚函数的基类的类也是派生的。非虚拟函数不支持虚拟调度,因此您不能通过基类指针/引用调用派生类的函数,而这些函数不是虚拟的。
-
您是否尝试过没有
virtual的相同示例?请注意,您必须实现Shape::draw才能尝试此操作。virtual的目的应该立即明确。 -
因为这个例子太简单了以至于没有抓住重点。它应该使用一个函数来代替
Shape*或Shape&参数来显示有用性。 -
我决定创建一个名为
Triangle的新Shape。任何采用Shape的函数都可以自动使用我的新类。
标签: c++ virtual-functions