C++调用使用重写函数的父类函数
C++ calling a parent class function that uses an overriden function
所以我想知道是否可以在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);
}
};
相关文章:
- 在派生类中将公共父析构函数设为私有
- 是否有 lint 工具可以检查子类虚拟函数是否与父类定义匹配?
- 重写子类构造函数中的父类变量
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何从派生类实例调用父类重载函数
- 是否有必要调用父构造函数而不使用子类构造函数的参数?
- C++:使用父类运算符函数更新子类对象的继承变量
- 使用父类构造函数初始化列表中的嵌套类字段中设置值
- 指向父类中派生类的函数的指针
- 通过调用两个参数化的父类构造函数来构造继承的类
- 重写父类的函数
- 从父级调用派生类重写函数.C++
- c++ 派生基类 Friend 函数访问父级上的私有函数
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 传递对象的地址会导致调用父类构造函数
- 如何从父类调用函数
- 为什么C++不使用父类构造函数?
- C++继承:调用父类构造函数
- 为什么派生类对象在没有参数的情况下自动调用父类构造函数
- 为什么我不能将命名空间放在父类构造函数调用中?