C++ C++;虚拟功能不冗余?

C++ C++;虚拟功能不冗余?,c++,virtual,virtual-functions,C++,Virtual,Virtual Functions,可能的重复项: 现在我正在学习C++,但是在编程语言方面我并不完全是黑暗的。有些事对我来说毫无意义。我的理解是类中的虚函数可以在子类中重写。但是,默认情况下不允许这样做吗?例如: class Color { public: void Declare() { std::cout <<"I am a generic color."; } }; class Purple : public Color { }; 类颜色{ 公众: void Declare()被

可能的重复项:

现在我正在学习C++,但是在编程语言方面我并不完全是黑暗的。有些事对我来说毫无意义。我的理解是类中的虚函数可以在子类中重写。但是,默认情况下不允许这样做吗?例如:

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

class Purple : public Color {
};
类颜色{
公众:

void Declare()
被调用时,即使变量中的对象是紫色的,区别在于如果你有一个函数foo,它接受一种颜色并调用它的declare方法,如果它们是虚拟的,你传入一个紫色,它会说我是紫色的,如果方法不是虚拟的,它会说我是一种通用颜色…

不,它不是冗余的新界

尝试:

您希望它打印“我是紫色的”。只有在您将
声明为虚拟的情况下,才会出现这种情况


在C++类中,允许在一个派生类中改写函数名的选择是C++程序中错误的一个次要来源。不同的语言在这个方面有不同的附加项。

< p>虚拟函数允许多态性。您可以有一个指向<强>基< /强>类的指针,它仍然调用派生C中的函数。姑娘,以你为例

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

将输出“I am a generic color”。如果
color
中的
Declare()
函数是
virtual
,则
Purple
中的函数将覆盖它,因此此代码将打印“I am Purple”。

<

Purple p;
Color* pC = &p;
pc->Declare();
如果函数
Declare
定义为非虚拟,则调用将转到基类。如果函数被定义为
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();
类颜色
{
公众:

无效声明(){std::cout类似的问题已经被问了很多次,并且给出了合理的答案。其中一个答案是:可能的重复,以及:存在单独的
virtual
关键字的真正原因,因为支持多态性通常需要为vtable提供额外的程序空间并增加对象的大小用于指向该vtable的指针。对于某些对象类型(尤其是小对象)这种开销是不可接受的。C++的哲学思想是只为你需要的功能付费。如果你需要多态性,因为它是解决问题的最好方法,那么就使用<代码>虚拟< />代码。如果你不需要它来为特定的类,那么你就不必支付它。<代码>颜色< /代码>应该有一个虚拟的或受保护的析构函数。
Purple p;
Color* pC = &p;
pc->Declare();
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();