c++ - C++ VIRTUAL 函数如何不冗余?

标签 c++ virtual virtual-functions

<分区>

Possible Duplicates:
Overriding vs Virtual
How am i overriding this C++ inherited member function without the virtual keyword being used?

我目前正在学习 C++,但在编程语言方面我并非一无所知。有些东西对我来说毫无意义。我的理解是类中的 VIRTUAL 函数可以在子类中被覆盖。但是,默认情况下不允许吗?例如:

class Color {
    public:
        void Declare() { std::cout <<"I am a generic color."; }
};

class Purple : public Color {
};

如果我创建一个 Purple 的实例,然后调用它的 Declare 函数,那么它显然会在控制台窗口中输出“我是一种通用颜色”。如果我想在 Purple 类中重写这个函数,我可以简单地在那里定义它来生成:

class Purple : public Color {
    public:
        void Declare() { std::cout <<"I am purple."; }
};

这当然会输出“我是紫色的”。到控制台。如果默认情况下我可以覆盖函数,那么让 VIRTUAL 函数专门告诉编译器它可以被覆盖有什么意义呢?抱歉这个愚蠢的问题。 :/

最佳答案

考虑这段代码:

class Color
{
public:
    void Declare() { std::cout << "I am a generic color"; }
};

class Purple : public Color
{
public:
    void Declare() { std::cout << "I am purple"; }
}

Color* color = new Purple();
color->Declare();

如所写,这将打印出“我是一种通用颜色”,即通过基类指针 (Color*) 调用 Declare() 将调用基类的函数实现。

如果在Color的Declare()声明前加上关键字virtual,就会打印出“I am purple”。 virtual 关键字告诉编译器,应该将通过基类指针调用的函数分派(dispatch)给具体类 (Purple) 实现。

关于c++ - C++ VIRTUAL 函数如何不冗余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930630/

相关文章:

ruby - 如何在不删除对外部 API 的访问的情况下为 ruby​​ 设置虚拟环境或沙箱?

c++ - 平面平铺成不规则大小的矩形

c++ - NeoPixel Arrays 让我的 ESP32 重新启动!为什么?

c++ - Objective-c中的class + (void)method与c++中的scope operator::的比较

c++ - 指向虚函数的指针是否仍会被虚拟调用?

android - 是否可以通过编程方式检测 Android 虚拟按钮?

c++ - GTKmm输入到控制台输出滞后1个字符

c++ - 虚拟类段错误

c++ - 覆盖另一个类中的虚方法以访问其在 C++ 中的成员

c++ - 可以在同一个类中重写纯虚函数吗?