0

我正在尝试理解虚函数。如何使我的 put() 函数成为虚拟函数?这需要对代码进行哪些更改?

#include <iostream>
#include <string>
using namespace std;

class Circle
{
public:
    Circle(double radius) {this->radius = radius; }
    void put() const {cout << "Radius = " << radius;}
private:
    double radius;
};

class ColoredCircle: public Circle
{
public:
    ColoredCircle(double radius, string color);
    void put() const;
private:
    string color;
};

ColoredCircle::ColoredCircle(double radius, string color)
    : Circle(radius), color(color) {}

void ColoredCircle::put() const
{
    Circle::put();
    cout << " Color = " << color;
}

int main()
{
    ColoredCircle redCircle(100., "red");
    Circle* circle1 = &redCircle;
    circle1->put();
    cout << endl;
    Circle circle(50.);
    Circle* circle2 = &circle;
    circle2->put();
    cout << endl;
    std::cin.get();
    return 0;
}
4

1 回答 1

1

您只需virtual在基类中的函数前面写关键字:

class Circle
{
public:
    Circle(double radius) {this->radius = radius; }
    virtual void put() const {cout << "Radius = " << radius;}
//  ^^^^^^^
private:
    double radius;
};

但是您应该了解使用virtual函数的情况。表演成本是多少,为什么有用等等......

一小段答案: Avirtual method是一个特殊的,method其行为可以在具有相同签名的继承中被class覆盖method

关于性能成本:调用虚函数时肯定存在可测量的开销——调用必须使用vtable来解析该类型对象的函数地址。额外的说明是您最不必担心的。vtables 不仅可以防止许多潜在的编译器优化,它们还可以破坏您的I-Cache

当然,这些惩罚是否严重取决于您的应用程序、这些代码路径的执行频率以及您的继承模式。

我建议你阅读一些关于虚函数的文章,这里是一个非详尽的列表:

于 2013-07-13T17:38:53.780 回答