如何要求childclass方法调用parentclass方法?
How to require child class method to call parent class method?
假设我有一个 parent class A
.
class A
{
public:
A() {}
void MyMethod()
{
printf( "A\n" );
}
};
我有一个 child class B
.
class B : public A
{
public:
B() {}
void MyMethod()
{
printf( "B\n" );
}
};
现在,我想要求 class B
调用 A::MyMethod()
,而不是显式调用它,如上所示。结果:
A
B
或者
B
A
可以吗?
现在B->MyMethod()
只调用child方法。
在 C++ 中,没有办法要求一个 class 方法调用另一个方法,除了要求派生 class 中的构造函数和析构函数必须调用父 class的,以特定的方式。
除此之外,在 C++ 中没有办法直接要求它。
Non-Virtual Interface成语有基础class定义一个public
non-virtual 成员函数,以及一个私有虚成员函数
是派生 classes.
的覆盖点
public non-virtual 成员函数充当面向 API 的 public。
私有虚拟成员函数充当class层次结构
面对 API.
将这两个问题分开可能是一种方便的技术,尤其是
对于更大的项目,为了调试目的,为了确保
基础 class 的 public non-virtual 中的预操作和 post- 操作
成员函数。
#include <iostream>
using std::cout;
namespace {
class A {
virtual void MyMethodImpl() const {
// Derived classes should override this virtual member function
// and add their extra steps there.
}
public:
virtual ~A() = default;
A() {}
void MyMethod() const {
cout << "A::MyMethod before steps.\n";
MyMethodImpl();
cout << "A::MyMethod after steps.\n";
}
};
class B : public A {
void MyMethodImpl() const override {
cout << "B::MyMethodImpl extra steps.\n";
}
public:
B() {}
};
} // anon
int main() {
B b;
b.MyMethod();
}
假设我有一个 parent class A
.
class A
{
public:
A() {}
void MyMethod()
{
printf( "A\n" );
}
};
我有一个 child class B
.
class B : public A
{
public:
B() {}
void MyMethod()
{
printf( "B\n" );
}
};
现在,我想要求 class B
调用 A::MyMethod()
,而不是显式调用它,如上所示。结果:
A
B
或者
B
A
可以吗?
现在B->MyMethod()
只调用child方法。
在 C++ 中,没有办法要求一个 class 方法调用另一个方法,除了要求派生 class 中的构造函数和析构函数必须调用父 class的,以特定的方式。
除此之外,在 C++ 中没有办法直接要求它。
Non-Virtual Interface成语有基础class定义一个public non-virtual 成员函数,以及一个私有虚成员函数 是派生 classes.
的覆盖点public non-virtual 成员函数充当面向 API 的 public。
私有虚拟成员函数充当class层次结构 面对 API.
将这两个问题分开可能是一种方便的技术,尤其是 对于更大的项目,为了调试目的,为了确保 基础 class 的 public non-virtual 中的预操作和 post- 操作 成员函数。
#include <iostream>
using std::cout;
namespace {
class A {
virtual void MyMethodImpl() const {
// Derived classes should override this virtual member function
// and add their extra steps there.
}
public:
virtual ~A() = default;
A() {}
void MyMethod() const {
cout << "A::MyMethod before steps.\n";
MyMethodImpl();
cout << "A::MyMethod after steps.\n";
}
};
class B : public A {
void MyMethodImpl() const override {
cout << "B::MyMethodImpl extra steps.\n";
}
public:
B() {}
};
} // anon
int main() {
B b;
b.MyMethod();
}