C++调用使用重写函数的父类函数

C++ calling a parent class function that uses an overriden function

本文关键字:父类 类函数 函数 重写 调用 C++      更新时间:2023-10-16

所以我想知道是否可以在C++调用使用重写方法的父类方法而不使用被覆盖方法的父版本。(我知道这还不清楚,所以我举了一个例子!

例如,下面我想从类 B 的对象调用类 A 的 findPath(( 版本,同时使用类 B 定义的 addPoint 方法.目前,如果我从类 B 的对象调用 findPath((,它使用类 A 中定义的 addPoint 方法。

实际输出:

A.findPath((, path = {1,2,3,4,5,6,7,8,9,10(

B.findPath((, path = {1,2,3,4,5,6,7,8,9,10(

期望输出:

A.findPath((, path = {1,2,3,4,5,6,7,8,9,10}

B.findPath((, path = {2,4,9,16,25,36,49,64,81,100}

class A 
{ 
public:
vector<int> path;
void addPoint(int num) {
path.push_back(num);
}
vector<int> findPath() {
for (int i = 0; i < 10; i++) {
addPoint(i);
}
} 
};
class B : public A
{
public:
void addPoint(int num) {
path.push_back(num*num);
}
};

目前,我正在将findPath复制并粘贴到B类中以获得所需的输出,但我觉得应该有一种更简单的方法。谢谢!

您需要在基类中使用virtual。您还应该在派生类中添加override,比较 CppCoreGuidelines。

class A 
{ 
public:
...
virtual void addPoint(int num) {
path.push_back(num);
}
...
};
class B : public A
{
public:
void addPoint(int num) override {
path.push_back(num*num);
}
};

这是可能的。这称为模板方法模式。这个名字有点不幸,因为它与C++模板无关。基类可以实现某些内容,派生类仅覆盖较大的"某些内容"的各个步骤。

例如:

struct Base {
virtual void stepA() = 0;
virtual void stepB() = 0;
virtual void stepC() = 0;
void do_something_complicated() {
stepA();
stepB();
stepC();
}
};

派生类仅重写各个步骤的方法,而它们已在基类中组合。

在您的示例中,您忘记将addPoint声明为虚拟,A应该有一个虚拟析构函数,建议使用override让编译器在出现错误时为您提供帮助:

class A 
{ 
public:
vector<int> path;
virtual void addPoint(int num) {
path.push_back(num);
}
vector<int> findPath() {                // () was missing
for (int i = 0; i < 10; i++) {
addPoint(i);
}
return path;                        // return was missing
} 
virtual ~A() = default;
};
class B : public A
{
public:
void addPoint(int num) override {
path.push_back(num*num);
}
};