我发现在编写接受主类或子类参数的函数(使用函数重载)时,通常会发生隐式向上转换(子类被升级为主类,而主类函数被调用).我不希望发生这种隐式的向上转换,因为它意味着潜在的细微错误并在以后引起问题.
我在google上搜索了有关这方面的信息,但是我可以使用的连贯信息很少,只是间接引用它.
如何禁用,停止或阻止隐式向上转换(甚至是向下转换)?
(我不能提供任何示例代码,因为这是一个不时发生的一般问题).
不,这与方法(我会指定方法)无关,而是与函数有关.
没有示例代码,但伪想法:void Function(BaseClass&A); void Function(SubclassClass&B);
Function(ASubclass); //Implicit upcasting occurs, calls BaseClass instead
Run Code Online (Sandbox Code Playgroud)
上述情况不会按常规发生(比如SubclassClass函数被淘汰/删除),但Subclass将被上传到BaseClass以与BaseClass函数一起使用,而不是报告错误或生成警告 - 或者会有所帮助,因为我不希望发生隐式的向上转换.
请不要将upcasting与非虚方法调用混淆.
class Base
{
};
class Derived1:public Base
{
};
class Derived2:private Base
{
};
void doSomething(Base *ptr)
{
}
int main()
{
Derived1 *ptr1 = new Derived1;
Derived2 *ptr2 = new Derived2;
doSomething(ptr1); //works fine
doSomething(ptr2); //Gives error
return 0;
};
Run Code Online (Sandbox Code Playgroud)
上溯造型:
只要派生类是publically从Base类派生的,Base类指针总是可以指向派生类对象.例如:第一个函数调用.
这种向上倾斜是隐含的.
如果推导是private这种向上转换不会隐式发生,编译器将发出错误.
但是,使用private继承并不是实现此行为的方法.如果它适合您的设计,您应该使用私有继承,它将隐含地保证您不会隐式地进行向上转换.
| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |