考虑以下代码
class A {
int x, y;
public:
A(){}
virtual void PrintSize(){ cout << sizeof(typeof(*this)) << endl; }
};
class B : public A {
int a, b, c;
public:
B(){}
};
int main() {
A obja;
B objb;
obja.PrintSize();
objb.PrintSize();
}
“ PrintSize()”的目的是获得我们从中调用它的当前类的大小。发生的是,即使我们从B调用它,该关键字仍指向类A。我们不希望这样,因为我们需要该功能对于子类是通用的。
显然,我们可以逐字重新定义每个类的功能。由于存在太多不必要的行,因此代码将变得更难处理。更不用说将函数重写为每个类都会破坏首先获得它的目的。
这是我的临时解决方法:
class A {
public:
virtual void PrintSize(){ cout << sizeof(typeof(*this)) << endl; }
};
class B : public A {
public:
virtual void PrintSize(){ cout << sizeof(typeof(*this)) << endl; }
};
class C : public A {
public:
virtual void PrintSize(){ cout << sizeof(typeof(*this)) << endl; }
};
class D : public A {
public:
virtual void PrintSize(){ cout << sizeof(typeof(*this)) << endl; }
};
您可以使用CRTP习惯用法来执行此操作。https://eli.thegreenplace.net/2011/05/17/the-curiously-recurring-template-pattern-in-c这个想法是父类是模板,因此您可以访问子类型直接在其中上课。这样,您就可以从子类中删除所有“ PrintSize”。
范例:
template <typename Derived>
class A {
int x, y;
public:
A() {}
void PrintSize() { cout << sizeof(Derived) << endl; }
};
class B : public A<B> {
int a, b, c;
public:
B() {}
};
class C : public A<C> {
public:
C() {}
};
int main() {
C objc;
B objb;
objc.PrintSize();
objb.PrintSize();
}
输出为:
8
20
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句