Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我会犯错误;A是B的一个不可接近的基础;使用动态_cast和模板时?_C++ - Fatal编程技术网

C++ 为什么我会犯错误;A是B的一个不可接近的基础;使用动态_cast和模板时?

C++ 为什么我会犯错误;A是B的一个不可接近的基础;使用动态_cast和模板时?,c++,C++,为什么对f的调用没有解析为第一个函数重载?我得到一个错误: source.cpp:在函数“int main()”中: source.cpp:12:31:错误:“A”是“B”的不可访问的基。 A类{};B类:A{}; void f(const A&{std::cout默认的类继承是私有的(class B:A{};默认为class B:private A{};) 因此,您无法通过键入A来处理b 编辑: 正如Rob所说:),解决方法是使用公共继承: class B : public A {}; 编辑

为什么对
f
的调用没有解析为第一个函数重载?我得到一个错误:

source.cpp:在函数“int main()”中:

source.cpp:12:31:错误:“A”是“B”的不可访问的基。

A类{};B类:A{};

void f(const A&{std::cout默认的类继承是私有的(
class B:A{};
默认为
class B:private A{};

因此,您无法通过键入
A
来处理
b

编辑: 正如Rob所说:),解决方法是使用公共继承:

class B : public A {};
编辑:
公共派生类与其基类之间的关系是“is a”,这意味着它是更泛型类型的专门化,因此,它实现了该泛型类的行为,可能还实现了更多

私有派生类与其基类之间的关系是“根据实现的”。它防止对象被视为基类的扩展。使用它的一个很好的例子是
boost::noncopyable
,它防止私有派生类的对象被复制。

在假设的情况下,需求包括私有继承,并且在某个点上创建了一个想要引用对象作为其基的函数,一个公共方法返回一个casted to base class指针
this
将像传统的
get()一样执行此操作
访问维护原始用途的私有数据成员

public:
    A *getBase() { return static_cast<A *>(this); }

dynamic\u cast
在向上转换时没有什么特别之处。
dynamic\u cast
在这种情况下相当于
static\u cast
。如果基存在,它在编译时执行,是明确的,可以访问。否则它无法编译

这正是在您的案例中发生的情况。基类是不可访问的(正如编译器已经告诉您的),因此cast无法编译

如果没有强制转换,第一个函数将从重载解析候选列表中排除(因为基函数不可访问),第二个函数获胜


实际上,你不需要任何演员来执行绝大多数的法律上的注解。至于非法的上传,没有C++的演员会帮助你(唯一的突破性的是私人继承的演员是C风格的演员阵容)。

A
B
私有基础,因此
B
类型的对象可以被视为
A&
的地方很少。如果您将继承更改为public,则强制转换将起作用,并选择
f
的非模板版本。但是
动态\u强制转换
过于苛刻;每个obj类型为
B
的ect是类型为
A
的对象,因此您可以使用
static\u cast
来消除调用的歧义。

它将失败,因为前面提到的私有继承以及
B
作为对象传递。
dynamic\u cast
仅适用于指针和引用


请参阅:

,解决方案是
classb:public A{};
严格地说,公共继承是一种“修复它的方法”是相当误导的。要解决什么问题?公共继承只不过是让编译器停止抱怨的一种方式。它在OP的代码中是否有意义取决于OP的意图。它实际上可能毫无意义。@AndreyT“但我试图做的是得到第一个调用。”OP忘记或不知道将
公开
,这似乎很清楚。@JohnKugelman-但这是一个正确的观点。如果私有继承是一个经过深思熟虑的设计决策,并且调用
f
的第一个版本是合适的,那么解决方案必须是改变继承以外的东西。当然,这是一个很大的If's,and's这里可能不是这样。@John Kugelman:代码和“获取第一个调用”的目标都太抽象,无法以任何特定的方式进行解释。争论“修复”的正确方式这就像争论
2+2=5
中的错误:有些人会认为它应该是
2+2=4
,另一些人会认为它应该是
2+3=5
。那么在什么样的情况下我会使用
dynamic\u cast
(与类一起)?反过来说,从
A&
B&
;这将是一个经过检查的转换,如果引用的对象不是A
B
,您将得到一个异常。但是,要使其工作,
A
必须至少有一个虚拟函数。
B
是一个左值,因此可以将
B
动态转换为引用类型。
public:
    A *getBase() { return static_cast<A *>(this); }
f(b.getBase());