变量返回类型上转换覆盖c++

Variant return type Upcasting Overriding c++

本文关键字:覆盖 c++ 转换 返回类型 变量      更新时间:2023-10-16

在以下示例中,我对clone()方法有问题。我期望sizeof(*((*ptr1).clone()))会和b1一样,sizeof(*(ptr2.clone()))会和c1一样大,但它们不是。它们是sizeof(a1)。我错过了什么?

代码如下:

class A
{int a;
public:
    virtual A * clone() {return this;}
};
class B : public A
{int b,c;
public:
    B * clone() {return this;}
};
class C : public A
{int b,c,d;
public:
    C * clone() {return this;}
};
int main()
{
    A a1;
    B b1;
    C c1;
    A * ptr1 = &b1;
    A & ptr2 = c1;
    std::cout << "sizeof(a1) = " << sizeof(a1) << 'n';
    std::cout << "sizeof(b1) = " << sizeof(b1) << 'n';
    std::cout << "sizeof(*(b1.clone())) = " << sizeof(*(b1.clone())) << 'n';
    std::cout << "sizeof(c1) = " << sizeof(c1) << 'n';
    std::cout << "sizeof(*((*ptr1).clone()))" << sizeof(*((*ptr1).clone())) << 'n';
    std::cout << "sizeof(*(ptr2.clone()))" << sizeof(*(ptr2.clone())) << 'n';
    return 0;
}

sizeof(*((*ptr1).clone()))是编译时值,表达式不执行。

这里我们有sizeof(*((*std::declval<A*>()).clone()))也就是sizeof(A)(我们用A::clone()返回A*)

sizeof只考虑其参数的静态类型,而不考虑动态类型。因此,sizeof的参数可以是一个未求值的操作数,并且sizeof的结果不依赖于任何运行时信息(例如动态类型信息所需的虚表)。因此,sizeof的结果总是一个编译时常量表达式,适合用作模板参数。

参见c++ 11:§5.3.3 [expr.sizeof]/2.