继承重写

问题描述 投票:0回答:4

我有一个关于早期/继承压倒一切的过程中后期绑定的问题。

所以我打算在基本面向对象的C ++和阅读,如果你不申报的基类的虚函数,你不能覆盖它。不过,我有以下的代码,它看起来像我的编译器是压倒一切对我来说反正。

#include <iostream>

using namespace std;

class Book{
public:
    string title;
    int number;

    Book(){
    }

    Book(string title){
        cout << "book " << title << " created" << endl;
    }

    void setNumber(int num){
        number = num + 7;
    }

    ~Book(){
        cout << "book " << title << " destroyed:";
    }
};

class Magazine: public Book {
public:

    void setNumber(int num){
    number = num;
    }
};

int main()
{
    Magazine mag;
    mag.setNumber(4);
    cout << mag.title << endl;
    cout << "the number you are looking for is: " << mag.number << endl;
}

在我的编译器的输出为4,但根据我读过C ++有早期绑定如果函数没有声明在基类的虚所以应该输出NUM + 7指出,它不应该是可以覆盖它上的基类。难道我只是得到一个不正确的资源?或者将这个可能是我的编译器中的错误/异常?

谢谢你们每一个人的帮助

c++ oop virtual
4个回答
5
投票

你可以在“越权”非虚函数,但执行不会被动态绑定,但静态。你会发现与多态性结合的区别:

Book* mag = new Magazine();
mag->setNumber(4);
cout << mag->title << endl;
cout << "the number you are looking for is: " << mag->number << endl;

这将调用Book的实现,而当你已经宣布的成员函数虚拟的,它会动态地绑定到杂志执行。


4
投票

你是不是覆盖你的函数。你要做的就是重新定义

如果你想确保你重写功能把qazxsw POI关键字的函数声明之后真正看到你overrided与否。

例:

override - (C ++ 11功能)

此外,它是很好的了解,如果你重新定义一个函数“要使用哪个函数(类型检查)”发生在编译的时候,如果你宣布你的虚拟函数同名它在运行时通过虚拟表机制发生。


1
投票

void suspicious() override;关键字真的只进场时,你处理多态性。而且,只有当你有一个指针/引用发生。

如果你已经做了,而不是像:

virtual

你会看到,我们最终调用int main() { Magazine mag; Book *b = &mag; b->setNumber(4); cout << b->title << endl; cout << "the number you are looking for is: " << b->number << endl; } ,即使我们实际上指向一个Book::setNumber()

如果声明Magazine作为setNumber功能和运行上面的代码,你就可以使用动态功能结合。因此,而不是马上就打电话给virtual,因为我们有一个Book::setNumber()指针,程序将动态地检查,看看有什么Book实际上是指向。因为它实际上是一个b对象,我们会再调用Magazine。这是一种多态性的魔力。


0
投票

而不是试图解释,我建议您尝试以下实验:

Magazine::setNumber()

然后重复与Book &book = Mag; book.setNumber(4); cout << mag.number << endl; 声明Book::setNumber

© www.soinside.com 2019 - 2024. All rights reserved.