C++ 遗产与超载功能
我认为几行代码将更清楚地解释我的问题,而不是冗长的解释。假设我有两个类,一个从另一个继承:C++ 遗产与超载功能,c++,oop,C++,Oop,我认为几行代码将更清楚地解释我的问题,而不是冗长的解释。假设我有两个类,一个从另一个继承: #include <iostream> class A{ public: void parse() { treatLine(); }; void treatLine() { std::cout << "treatLine in A" <&
#include <iostream>
class A{
public:
void parse()
{
treatLine();
};
void treatLine()
{
std::cout << "treatLine in A" << std::endl;
}
};
class B : public A{
public:
void treatLine()
{
std::cout << "treatLine in B" << std::endl;
}
};
int main()
{
B b;
b.parse();
return 0;
}
#包括
甲级{
公众:
void parse()
{
treatLine();
};
无效处理行()
{
std::coutMaketreatLine
virtual:
virtual void treatLine() {
std::cout << "treatLine in A" << std::endl;
}
virtual-void-treatLine(){
std::coutMaketreatLine
virtual:
virtual void treatLine() {
std::cout << "treatLine in A" << std::endl;
}
virtual-void-treatLine(){
std::cout在虚拟中生成treatLine函数在虚拟中生成treatLine函数所有的B
都是影子A
,而不是覆盖它。你缺少一个关键字。@chris B的方法treatLine确实覆盖了A的方法,不是吗?如果它覆盖了,你不认为它会覆盖调用吗?你需要virtual
在那里(仅在基类中需要,在派生类中可选)将函数标记为要重写的函数。由于C++11,您也可以在派生类中执行此操作,这会给您一个编译器错误,因为它不是虚拟的:void treatLine()override{…}
。好吧,这就是我问题的重点,我不知道有必要使用虚拟这个词来重写我的函数。我现在知道:)所有B
所做的都是shadowA
,而不是重写它。你缺少一个关键字。@chris B的方法treatLine确实重写了A的方法,不是吗?如果它重写了,它就会被重写取消调用,你不这样认为吗?你需要那里的virtual
(仅在基类中是必需的,在派生类中是可选的)来将函数标记为要重写的函数。因为C++11,你也可以在派生类中这样做,这会给你一个编译器错误,因为它不是虚拟的:void treatLine()override{…}
。好吧,这就是我的问题所在,我不知道需要使用虚拟这个词来覆盖我的函数。我现在知道:)@JerryCoffin哈哈,修正:)读得不好,我以为我会先提到静态,然后再提到动态。使treatLine
虚拟会给treatLine
带来额外的开销d和一个额外的隐藏成员变量(指向vtable的指针)将放在A
和B
的所有实例中
在B
中,它在A
中的定义方式不会,并且很可能会给出Ote所寻找的结果。通常,当您有指向基类指针的指针时,您应该只使用虚拟函数,该指针可能指向同一层次结构中许多不同类的实例。在这种情况下,奇怪的是循环模板模式也可以用于重载解析
@JerryCoffin哈哈,修复:)阅读不好,我想我应该先提到静态,然后再提到动态。使treatLine
虚拟将调用treatLine
一个额外的开销和一个额外的隐藏成员变量(指向vtable的指针)将放在A
和B
的所有实例中。重新定义void parse()
在B
中,它在A
中的定义方式不会,并且很可能会给出Ote所寻找的结果。通常,当您有指向基类指针的指针时,您应该只使用虚拟函数,该指针可能指向同一层次结构中许多不同类的实例。在这种情况下,奇怪的是循环模板模式也可用于重载分析。