为什么没有隐式定义继承

Rot*_*tem 3 c++ inheritance virtual-functions

这可能之前已经回答过,但我找不到这些词.

我试图将我的头脑包裹在继承中C++,但是来自C#我似乎无法理解以下案例背后的原因:

Foo.h

class Foo {
    virtual void DoSomething();
}

class Bar : Foo { }
Run Code Online (Sandbox Code Playgroud)

Bar.cpp

#include "Foo.h"    
void Bar::DoSomething() 
{
    //Compiler error C2509 - member function not declared in 'Bar'
}
Run Code Online (Sandbox Code Playgroud)

既然DoSomething是一个虚函数,那么它是否会被隐含地声明为一部分Bar

如果我继承了很多不同的类Foo,我真的需要DoSomething在每一个中明确声明吗?

C++处理这种情况还有哪些其他结构?

AnT*_*AnT 10

C++语言建立在与C相同的独立翻译原则之上.这意味着C++程序中的所有翻译单元应该完全相互独立地编译.当编译器本身已经完成工作时,它们将被链接到最终程序中.

在类的情况下,为了能够独立编译每个翻译单元,编译器必须能够通过单独查看类的定义(即通常放在的类中)来构建对给定类的充分理解.头文件.在编译一个翻译单元时,编译器必须知道在某些其他翻译单元中DoSomething覆盖Bar并且该定义void Bar::DoSomething()存在于某处.为了实现这一点,类定义必须包含所有类成员函数的声明.

关于"纯虚函数"的推理对我来说完全不清楚.首先,它在您的代码示例中并不纯粹(显然您只是忘记了= 0部分).其次,仅仅因为基类函数是纯粹的并不意味着派生类函数应该是非纯的.它很可能Bar也应该是一个抽象类.这是你的意图问题,编译器不知道.