我有一个关于早期/继承压倒一切的过程中后期绑定的问题。
所以我打算在基本面向对象的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指出,它不应该是可以覆盖它上的基类。难道我只是得到一个不正确的资源?或者将这个可能是我的编译器中的错误/异常?
谢谢你们每一个人的帮助
你可以在“越权”非虚函数,但执行不会被动态绑定,但静态。你会发现与多态性结合的区别:
Book* mag = new Magazine();
mag->setNumber(4);
cout << mag->title << endl;
cout << "the number you are looking for is: " << mag->number << endl;
这将调用Book
的实现,而当你已经宣布的成员函数虚拟的,它会动态地绑定到杂志执行。
你是不是覆盖你的函数。你要做的就是重新定义
如果你想确保你重写功能把qazxsw POI关键字的函数声明之后真正看到你overrided与否。
例:
override
- (C ++ 11功能)
此外,它是很好的了解,如果你重新定义一个函数“要使用哪个函数(类型检查)”发生在编译的时候,如果你宣布你的虚拟函数同名它在运行时通过虚拟表机制发生。
该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
。这是一种多态性的魔力。
而不是试图解释,我建议您尝试以下实验:
Magazine::setNumber()
然后重复与Book &book = Mag;
book.setNumber(4);
cout << mag.number << endl;
声明Book::setNumber
。