C++ 继承 - 覆盖函数,包括使用 "::"s、.h 文件和 .cpp 文件

Posted

技术标签:

【中文标题】C++ 继承 - 覆盖函数,包括使用 "::"s、.h 文件和 .cpp 文件【英文标题】:C++ Inheritance - Overriding Function, including using "::"s, .h files & .cpp files 【发布时间】:2017-04-08 17:04:17 【问题描述】:

我已经查看了所有内容,但找不到任何涉及 :: 运算符的资源。

我有 2 个课程:AB。我还有另一堂课C

B 继承自 AC 也是如此。

A 包含一个名为d 的方法:

A.h 文件:

class A

public:
    ...
    void d();
;

A.cpp 文件:

...
void A::d()

    ...

如果我有BC,并且我运行他们的d,那么如果BC 没有自己的覆盖d,则应该运行此方法。

我想在B 中覆盖d,但是我不清楚我是如何做到这一点的。我应该在B.cpp 文件中执行此操作吗?:

void A::d()

    ...

void B::d()

    ...

并在B.h 文件中声明它?

或者函数应该是virtual

【问题讨论】:

看来是时候好好谈谈C++ book了。 使函数虚拟化。如果 A 是抽象的,则将其设为私有虚拟。然后在子类中用 override 关键字覆盖该函数。在 C++ 中,函数需要是虚拟的,没有像 Java 中那样的自动调用。 @4386427:它是“范围解析运算符”。 【参考方案1】:

覆盖是成员函数的一个属性,它是类定义的一部分。

您想要的示意图:

struct A

    virtual void d()  /* A's implementation */ 
;

struct B : A

    void d() override  /* B's override of A::d */ 
;

struct C : A

:

用法:假设你有这个功能:

void g(A & a)  a.d(); 

然后:

B b;
g(b);   // calls b's B::d

C c;
g(c);   // calls c's A::d on the A-subobject of c

(如何将代码拆分为不同的文件与继承和覆盖无关。)

【讨论】:

如果A::d() 未标记为virtual,请考虑添加一些有关此行为如何变化的信息。

以上是关于C++ 继承 - 覆盖函数,包括使用 "::"s、.h 文件和 .cpp 文件的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

多级继承 C++

C++ 虚函数表解析

C++ 虚函数表解析

C++ 虚函数表解析

C++ 虚函数表解析