自动调用基类函数
Automatic calling of base class functions
我试图尽可能(或至少使用GNU)编译器/内置函数来了解C++类的一些更高级的观点。所有这些都基于(大型和广泛的)工作项目的记录器概念。这让我想到了这个伪代码:
class Base {
public:
void increment(){
++m_Val;
}
private:
static int m_Val;
};
class Above : private Base{
public:
void doA(){
//Foo
}
void doB(){
//Bar
}
};
这已经作为一个概念表现出来;有没有一种方法可以让 base 的继承允许 doA()
和 doB()
隐式调用 base 函数increment()
,而无需我实际将函数调用添加到继承它的每个类的每个函数中increment()
?如果不是直接答案,是否有一个特定的术语来称呼我想做的事情?还是作为 Boost 或其他库的一部分提供?
实现类似效果的一种方法是提供一种方法来重写和公开调用前置条件和后置条件的不同公共方法。
class Base {
public:
void increment(){
++m_Val;
std::cout << m_Val << 'n';
}
void doA(){
increment();
implA();
}
void doB(){
increment();
implB();
}
protected:
virtual void implA() = 0;
virtual void implB() = 0;
private:
int m_Val;
};
class Above : private Base{
public:
using Base::doA;
using Base::doB;
protected:
virtual void implA() override {
std::cout << "an";
}
virtual void implB() override {
std::cout << "bn";
}
};
int main()
{
Above a;
a.doA();
a.doB();
}
演示
您必须显式定义何时调用基方法,但可以通过抽象出对增量的调用来完成 - 尝试类似这种模式(伪代码,使用 Java 术语,因为我不太熟悉等效的C++语法,但您应该了解它的要点):
abstract class Base {
public:
void increment(){
++m_Val;
}
void doA(){
increment();
doAInternal();
}
void doB(){
increment();
doBInternal();
}
protected:
abstract void doBInternal();
abstract void doAInternal();
private:
static int m_Val;
};
class Above : private Base{
public:
void doAInternal(){
//Foo
}
void doBInternal(){
//Bar
}
};
在偶然发现这一点之后; 最接近我正在寻找的解决方案称为"执行绕过指针",如此处定义。特别是与以下方面有关的部分:
通常,需要在类的每个成员函数调用之前和之后执行功能。
这在以下代码片段中表示,这些代码片段取自上述链接。
class VisualizableVector {
public:
class proxy {
public:
proxy (vector<int> *v) : vect (v) {
std::cout << "Before size is: " << vect->size ();
}
vector<int> * operator -> () {
return vect;
}
~proxy () {
std::cout << "After size is: " << vect->size ();
}
private:
vector <int> * vect;
};
VisualizableVector (vector<int> *v) : vect(v) {}
proxy operator -> () {
return proxy (vect);
}
private:
vector <int> * vect;
};
int main()
{
VisualizableVector vecc (new vector<int>);
//...
vecc->push_back (10); // Note use of -> operator instead of . operator
vecc->push_back (20);
}
相关文章:
- 使用子类覆盖基类中定义的函数
- 如何基于模板化类的基类专门化成员函数
- C++虚拟函数:基类函数是调用的,而不是派生的
- 复制派生类更改基类的构造函数
- memcpy派生类到基类,为什么还调用基类函数
- 无法在 c++ 中使用参数从 dericed 类调用基类构造函数
- 为具有不同签名的函数的派生类设计基类
- 我们是否应该从派生类调用基类移动复制/分配构造函数
- C++使用派生类调用基类成员函数的继承
- 使用多个派生类调用基类成员函数
- 派生模板类中基类构造函数的可见性
- 从派生类实现基类构造函数专用化的替代方法是什么
- 从派生类调用基类函数时出现问题
- 仅授予派生类对基类数据成员/函数的 const 访问权限
- 虚拟函数-基类指针
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 从派生类访问基类函数
- 我不希望派生类继承基类的构造函数
- 成员函数指针强制转换,从派生类到基类
- 如何访问受保护的基类函数,从派生类通过基类ptr