【问题标题】:trouble understanding dynamic polymorphism难以理解动态多态性
【发布时间】:2020-07-18 08:33:27
【问题描述】:

我是 C++ 新手,我正在学习动态多态性。但是我对细节感到非常困惑。任何人都可以解释为什么我们使用virtualoverride 和使用pure virtual functions,即使我们可以重载方法??

谢谢

【问题讨论】:

标签: c++ oop polymorphism overloading pure-virtual


【解决方案1】:

看这段代码:

class Base
{
    public:
    void my_method() { std::cout << "base" << std::endl; }
};

class Derived : public Base
{
    public:
    void my_method() { std::cout << "derived" << std::endl; }
};

int main()
{
    Base* object = new Derived;
 
    object->my_method();
 
    delete object;

    return 0;   
}

已实现:http://www.cpp.sh/4z4p

尽管object 被构造为Derived,但它的输出是“base”。在Base::my_method 前面添加virtual,这会发生变化。将override 添加到Derived::my_method,如果它没有实际覆盖,它将无法编译。

请注意,虽然这里的事情简单明了,但稍后您会遇到更复杂的情况,您可能会认为您会覆盖而实际上并没有。例如,您可能会在基类中更改方法的签名而忘记在子类中更改它,或者反过来。

纯虚方法是为了表明要实现的东西。这个想法是你创建一个接口,它只确定一组类应该能够做什么,但它本身不做任何事情。一个纯虚拟类,就是这样。在Java中,接口实际上是一个关键字。
如果你的基类有一个纯虚方法,而你的子类没有实现它,你的编译器会报错,这很有用。

您的列表中没有但仍然有些用处的是关键字final,您不允许使用它派生类,基本上与接口相反。

【讨论】:

    【解决方案2】:

    重载函数意味着具有相同的函数名称和不同的签名 - 即不同的参数和/或返回类型。

    int test(int a)
    void test();
    

    这里,int test(int a)void test() 的重载。

    virtual 只存在于继承的上下文中。它的意思是“嘿,这个函数可以在子类中被覆盖”。

    override 只是暗示您实际上打算覆盖虚函数。

    pure virtual functions 看起来像这样:

    void virtualFunction() = 0;
    

    并且意味着这个函数是抽象的(在 C# 和 Java 术语中),即它不包含这个类中的实现,但意味着在它的一个子类中被覆盖。事实上,你不能用非重写的纯虚函数来实例化一个类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2021-10-14
      • 2015-07-14
      • 1970-01-01
      相关资源
      最近更新 更多