Héc*_* C. 1 c++ typecast-operator c++11 typecasting-operator
我试图按照此处显示的内容为对象之间的类型转换做一些示例代码。
这是家长班
// ParentClass.h
class ParentClass {
public:
ParentClass();
virtual ~ParentClass();
};
Run Code Online (Sandbox Code Playgroud)
这只是一些概念证明,它唯一要做的就是打印一些东西
#include <iostream>
#include "ParentClass.h"
ParentClass::ParentClass()
{
std::cout << "Parent\tDefault constructor\n";
}
ParentClass::~ParentClass()
{
std::cout << "Parent\tDestructor\n";
}
Run Code Online (Sandbox Code Playgroud)
然后,派生类
// ChildClass.h
#include "ParentClass.h"
class ChildClass: public ParentClass {
public:
ChildClass();
// conversion constructor
ChildClass( const ParentClass& p );
// conversion from assignment
ChildClass& operator= ( const ParentClass & p );
// type-cast operator
operator ParentClass();
// destructor
virtual ~ChildClass();
};
Run Code Online (Sandbox Code Playgroud)
然后,代码也很愚蠢
// ChildClass.cpp
#include <iostream>
#include "ChildClass.h"
ChildClass::ChildClass()
{
std::cout << "Child\tDefault constructor\n";
}
ChildClass::~ChildClass()
{
std::cout << "Child\tDestructor\n";
}
// conversion constructor
ChildClass::ChildClass( const ParentClass& p )
{
std::cout << "Child\tConversion constructor\n";
}
// assignment operator
ChildClass& ChildClass::operator= ( const ParentClass & p )
{
std::cout << "Child\toperator= conversion\n";
return *this;
}
// type-cast operator
ChildClass::operator ParentClass()
{
std::cout << "Child\toperatorParentClass()\n";
return ParentClass();
}
Run Code Online (Sandbox Code Playgroud)
然后,我在主函数中进行了一些转换
std::cout << "calls Parent default constructor\n";
ParentClass foo;
std::cout << "calls Parent to child constructor\n";
ChildClass bar = foo;
std::cout << "calls assignment operator from child\n";
bar = foo;
std::cout << "calls Child type-cast operator\n";
foo = bar;
std::cout << "Exit\n";
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,代码没有从派生类输入类型强制转换运算符,它只会输出以下内容:
calls Parent default constructor
Parent Default constructor
calls Parent to child constructor
Parent Default constructor
Child Conversion constructor
calls assignment operator from child
Child operator= conversion
calls Child type-cast operator
Exit
Child Destructor
Parent Destructor
Parent Destructor
Run Code Online (Sandbox Code Playgroud)
我对此不知所措,因为我尝试了上面链接中的代码,它按应有的方式工作。
派生基转换永远不会调用转换函数。[class.conv.fct] / p1:
绝不使用转换函数将(可能具有cv限定)对象转换为(可能具有cv限定)相同对象类型(或对其的引用),转换成该类型(可能具有cv限定)的基类(或对其的引用)或(可能具有cv资格)
void。
在您的中foo = bar;,bar绑定直接绑定到const ParentClass&的隐式声明的副本分配运算符的参数ParentClass。
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |