隐含的向上翻译问题

SSi*_*ht3 -2 c++

我发现在编写接受主类或子类参数的函数(使用函数重载)时,通常会发生隐式向上转换(子类被升级为主类,而主类函数被调用).我不希望发生这种隐式的向上转换,因为它意味着潜在的细微错误并在以后引起问题.

我在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与非虚方法调用混淆.

Alo*_*ave 6

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继承并不是实现此行为的方法.如果它适合您的设计,您应该使用私有继承,它将隐含地保证您不会隐式地进行向上转换.