Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++继承-覆盖函数,包括使用“::”、.h文件和.CPP文件_C++_Inheritance_Virtual_Header Files - Fatal编程技术网

C++继承-覆盖函数,包括使用“::”、.h文件和.CPP文件

C++继承-覆盖函数,包括使用“::”、.h文件和.CPP文件,c++,inheritance,virtual,header-files,C++,Inheritance,Virtual,Header Files,我已经找遍了,找不到关于::操作符的任何资源 我有两个班:A班和B班。我还有一个C班 B继承自A,C继承自A A包含一个名为d的方法: A的.h文件: A的.cpp文件: 如果我有一个B或C,并且我运行了它们的d,那么如果B或C没有自己的被重写的d,那么应该运行这个方法 我想在B中覆盖d,但是我不清楚我是如何做到这一点的。我应该在B的.cpp文件中执行此操作吗 或 并在B的.h文件中声明 还是函数应该是虚拟的?重写是虚拟成员函数的属性,也是类定义的一部分 示意图上,您需要: struct A {

我已经找遍了,找不到关于::操作符的任何资源

我有两个班:A班和B班。我还有一个C班

B继承自A,C继承自A

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

A的.h文件:

A的.cpp文件:

如果我有一个B或C,并且我运行了它们的d,那么如果B或C没有自己的被重写的d,那么应该运行这个方法

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

并在B的.h文件中声明


还是函数应该是虚拟的?

重写是虚拟成员函数的属性,也是类定义的一部分

示意图上,您需要:

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(); }
然后:


如何将代码拆分为不同的文件与继承和重写无关。

重写是虚拟成员函数的属性,也是类定义的一部分

示意图上,您需要:

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(); }
然后:


如何将代码拆分为不同的文件与继承和重写无关。

看来是时候好好地做一次了。将函数虚拟化。如果是抽象的,则将其设为私有虚拟。然后在子类中使用override关键字重写函数。在C++中,函数需要是虚拟的,没有像java那样的自动调用。@ 4386427:它是范围解析操作符。看起来是时候好了。让函数虚拟化。如果是抽象的,则将其设为私有虚拟。然后在子类中使用override关键字重写函数。在C++中,函数需要是虚拟的,没有像java那样的自动调用。@ 4386427:它是范围解析运算符。如果A:D没有标记为虚拟的,请考虑添加一些关于此行为如何改变的信息。如果A:D没有标记为虚拟的,请考虑添加一些关于此行为如何改变的信息。
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