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

Trad_NotSuitedPC

考虑以下代码

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

存储指向基类中派生类函数的指针

基类中派生类的组成

基类中派生类的范围-python中的继承

C++ 继承:基类类型的虚函数中派生类类型的参数

了解虚拟派生类的大小

使用非虚拟基类函数与派生类未实现虚拟函数之间的区别

C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

(为什么)在纯虚拟派生类中是否需要虚拟基类构造函数调用?

从派生类中删除虚拟函数

在派生类中重写哪个基类的虚拟析构函数

意外地能够从基类ctor调用派生类虚拟函数

派生类是否需要在基类上声明其自己的虚拟函数版本?

为什么派生类的构造函数要在C ++中初始化虚拟基类?

为C ++中的基类和派生类声明“虚拟”构造函数?

虚拟析构函数在基类和派生类中均未调用

为什么派生类的私有虚拟成员函数可以从基类访问

基类如何调用c ++中派生类传递的闭包?

如果基类析构函数是虚拟的,派生类的析构函数是否默认为虚拟?

接受Chapel中派生类的类方法

引用派生类时基类的对象大小

从派生类构造函数调用基类构造函数

从使用派生类成员函数的基类调用函数

基类函数不调用派生类函数

派生类的虚函数调用基类的虚函数

在派生类中声明虚拟方法是错误的,该派生类的基类没有虚拟方法?

为什么派生类指针指向基类可以调用派生类成员函数?

即使它们是私有的,基类的好友函数如何调用派生类的重写虚拟函数?(C ++)

在C ++中,如何访问基本函数中派生类的成员?(这甚至是正确的做法吗?)

从Java中的派生类调用基类构造函数