gpt4 book ai didi

c++ - 虚拟基类函数中派生类的大小

转载 作者:行者123 更新时间:2023-12-01 14:42:43 25 4
gpt4 key购买 nike

考虑以下代码

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

关于c++ - 虚拟基类函数中派生类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62311094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com