gpt4 book ai didi

c++ - 使用 dynamic_cast 向上转换到 protected 基

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:18 27 4
gpt4 key购买 nike

本书The c++ programming language有这个代码:

class BB_ival_slider : public Ival_slider, protected BBslider {
// ...
};

void f(BB_ival_slider* p)
{
Ival_slider* pi1 = p; // OK
Ival_slider* pi2 = dynamic_cast<Ival_slider*>(p); // OK
BBslider* pbb1 = p; // error: BBslider is a protected base
BBslider* pbb2 = dynamic_cast<BBslider*>(p); // OK: pbb2 becomes nullptr
}

我尝试使用以下代码证明此行为以便更好地理解:

#include <iostream>

class Ival_slider {
public:
Ival_slider() {
std::cout << "Ival_slider called" << '\n';
}
};

class BBslider {
public:
BBslider() {
std::cout << "BBslider called" << '\n';
}
};

class BB_ival_slider : public Ival_slider, protected BBslider {
public:
BB_ival_slider() {
std::cout << "BB_ival_slider called" << '\n';
}
};


int main() {
BB_ival_slider* p = new BB_ival_slider{};
Ival_slider* p1 = p;
Ival_slider* p2 = dynamic_cast<Ival_slider*>(p);
BBslider* pbb2 = dynamic_cast<BBslider*>(p);
if (pbb2) {
std::cout << "true" << '\n';
}
}

但是,

BBslider* pbb2 = dynamic_cast<BBslider*>(p);

似乎没有按预期工作。

g++ -std=c++11 -O0 -g3 -Wall -c -fmessage-length=0 -o cast.o "..\\cast.cpp"
..\cast.cpp: In function 'int main()':
..\cast.cpp:29:43: error: 'BBslider' is an inaccessible base of 'BB_ival_slider'
BBslider* pbb2 = dynamic_cast(p);
^
..\cast.cpp:29:43: error: 'BBslider' is an inaccessible base of 'BB_ival_slider'

我认为 dynamic_cast 至少应该返回 nullptr。书错了吗?我正在使用 GCC 4.9.2。

最佳答案

dynamic_cast这里和static_cast没什么区别,编译器发现用户代码试图访问一个 protected 基,这是非法的。 dynamic_cast 不会隐藏或推迟任何编译时错误。如果在编译时可以确定强制转换是非法的,编译器将永远不会生成任何代码,并依靠您在运行时检查强制转换是否确实不正确。

关于c++ - 使用 dynamic_cast 向上转换到 protected 基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29443650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com