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::coutMake
treatLine
virtual:

virtual void treatLine() {
    std::cout << "treatLine in A" << std::endl;
}
virtual-void-treatLine(){

std::coutMake
treatLine
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
所做的都是shadow
A
,而不是重写它。你缺少一个关键字。@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所寻找的结果。通常,当您有指向基类指针的指针时,您应该只使用虚拟函数,该指针可能指向同一层次结构中许多不同类的实例。在这种情况下,奇怪的是循环模板模式也可用于重载
分析