【问题标题】:How am i overriding this C++ inherited member function without the virtual keyword being used?我如何在不使用 virtual 关键字的情况下覆盖这个 C++ 继承的成员函数?
【发布时间】:2010-06-07 22:03:44
【问题描述】:

我有一个小程序来演示简单的继承。我正在定义一个派生自哺乳动物的 Dog 类。这两个类共享一个名为 ToString() 的简单成员函数。当我不使用 virtual 关键字时,Dog 是如何覆盖 Mammal 类中的实现的? (我什至需要使用 virtual 关键字来覆盖成员函数吗?)

哺乳动物.h

#ifndef MAMMAL_H_INCLUDED
#define MAMMAL_H_INCLUDED

#include <string>

class Mammal
{
    public:
        std::string ToString();
};

#endif // MAMMAL_H_INCLUDED

哺乳动物.cpp

#include <string>
#include "mammal.h"

std::string Mammal::ToString()
{
    return "I am a Mammal!";
}

狗.h

#ifndef DOG_H_INCLUDED
#define DOG_H_INCLUDED

#include <string>
#include "mammal.h"

class Dog : public Mammal
{
    public:
        std::string ToString();
};

#endif // DOG_H_INCLUDED

狗.cpp

#include <string>
#include "dog.h"

std::string Dog::ToString()
{
    return "I am a Dog!";
}

main.cpp

#include <iostream>
#include "dog.h"

using namespace std;

int main()
{
    Dog d;
    std::cout << d.ToString() << std::endl;
    return 0;
}

输出

I am a Dog!

我在 Windows 上通过 Code::Blocks 使用 MingW。

【问题讨论】:

  • 考虑屏蔽而不是覆盖。
  • 天哪,我面前还有同样该死的任务。

标签: c++ inheritance


【解决方案1】:

它不是覆盖基类中的ToString 方法,因为基类方法不是virtual。它只是用具有相同签名的函数隐藏该函数。

当您在 Dog 对象上调用 ToString() 时,将调用 Dog::ToString 方法。为什么它会调用任何其他ToString() 方法; Dog:: 声明是第一个找到的? virtual 只有在通过指针或对基类对象的引用调用时才会发生(并且只需要)调度。

如果您需要在 Dog 对象上调用基类方法,则必须明确限定它。

d.Mammal::ToString()

【讨论】:

    【解决方案2】:

    您的代码直接使用 Dog 对象,因此当您调用 ToString() 时,它会静态绑定到 Dog::ToString(),并产生“我是狗!”。

    为了演示多态性,您可以从指向基类的指针(或引用)开始,但将其设置为引用派生类的对象:

    Dog d;
    Mammal &m = d;
    
    std::cout << m.ToString(); // will produce "I am a Mammal!".
    std::cout << d.ToString(); // will produce "I am a Dog!"
    

    以这种方式调用,如果您将ToString 设为虚拟,则输出将取决于指向的对象类型,而不是指针/引用本身的类型(因此上述两个调用都会产生“我是一只狗” !”)。

    【讨论】:

      【解决方案3】:

      尝试在 Mammal 类中的 ToString() 方法中添加 virtual。我想这就是你想要的。

      class Mammal
      {
          public:
              virtual std::string ToString();
      };
      

      【讨论】:

        猜你喜欢
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        相关资源
        最近更新 更多