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 个课程:A
和 B
。我还有另一堂课C
。
B
继承自 A
,C
也是如此。
A
包含一个名为d
的方法:
A
的.h
文件:
class A
public:
...
void d();
;
A
的.cpp
文件:
...
void A::d()
...
如果我有B
或C
,并且我运行他们的d
,那么如果B
或C
没有自己的覆盖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 文件的主要内容,如果未能解决你的问题,请参考以下文章