当我有2个类实现了转换构造函数和转换运算符时,可能会出现需要显式转换的情况,因为隐式不起作用? (我用2类作为示例,看看继承是否有任何区别)
答案 0 :(得分:2)
当隐式应用多个转换时,可能需要进行显式转换以解决歧义:
#include <iostream>
using namespace std;
void f(double x) {
cout << "Double\n";
}
void f(int x) {
cout << "Integer\n";
}
struct C
{
C(float x) { this->x = x; }
operator int() { return (int)x; }
operator double() { return (double)x; }
float x;
};
int main(int argc, char* argv[])
{
C c(1);
f(c); // error C2668: 'f' : ambiguous call to overloaded function
f(static_cast<double>(c)); // calls f(double)
f(static_cast<int>(c)); // calls f(int)
}
答案 1 :(得分:1)
只要你有相关的构造函数
class A
{
// ...
A(const B& b); // or similar
};
类型
的隐式转换B b(...); // B is the other class
A a = b;
或
B b(...);
A a(b);
会奏效。
答案 2 :(得分:1)
以下是继承的示例,其中显式类型转换是必需的:
// Base class.
class Foo
{
};
// Derived class.
class Bar : public Foo
{
public:
void SomeMethod()
{
cout << "I a in Bar!" << endl;
}
};
// Global method; input argument is derived class pointer.
void method(Bar* obj)
{
obj->SomeMethod();
}
// main
int main()
{
Foo* obj1 = new Foo();
method(obj1); // This line will error when passing the base class object
// error C2664: 'method' :
//cannot convert parameter 1 from 'Foo *' to 'Bar *'
return 0;
}
所以在这里你需要显式地将强制转换为派生类。
method((Bar*) obj1);
希望这有帮助。