变量返回类型上转换覆盖c++
Variant return type Upcasting Overriding c++
在以下示例中,我对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.
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- 覆盖应用程序的低级别键盘挂钩问题
- glBindTexture 是否覆盖活动纹理单元的内容
- "虚拟""覆盖"析构函数