gpt4 book ai didi

c++ - 使用间接父类的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:38 26 4
gpt4 key购买 nike

考虑以下代码:

class user_error : public std::runtime_error
{
public:
using std::exception::what;
explicit user_error(const std::string& what_arg):std::runtime_error(what_arg){}
};


class with_overriden_what : public user_error {
public:
with_overriden_what(const std::string& val) : user_error("user_error"), message(val) { }

std::string message;

virtual const char* what() const noexcept {
return message.c_str();
}
};

用这个调用:

with_overriden_what ex("thrown");
std::cout << "1. direct result: " << ex.what() << "\n";
std::cout << "2. sliced result: " << static_cast<user_error>(ex).what() << "\n";
std::cout << "3. ranged result: " << ex.user_error::what() << "\n";

令我惊讶的是 2 和 3 的结果不同:

1. direct result: thrown
2. sliced result: user_error
3. ranged result: std::exception

问:标准中是否有解决此行为的段落?

最佳答案

2.和3.的区别在于2.使用动态(==虚拟)调度(==调用)。当调用虚函数时,隐式使用动态调度(请参阅后面的异常(exception)情况)。因此 2. 调用最派生的覆盖,它是 std::runtime_error::what,它打印给构造函数的消息 "user_error",如构造函数的发布条件:

[runtime.error]

runtime_error(const char* what_arg);

4 Effects: Constructs an object of class runtime_error.

5 Postcondition: strcmp(what(), what_arg) == 0.


即使函数是虚拟的,使用范围解析运算符的函数调用也会进行静态分派(dispatch)。

[class.virtual]

15 Explicit qualification with the scope operator (5.1) suppresses the virtual call mechanism.

因此覆盖对于 3 无关紧要。重要的是名称解析。 using 声明与任何其他成员声明一样,它隐藏本来会从父级解析的相同名称。

因此,user_error::what 隐藏了 std::runtime_error::what。并且,user_error::whatstd::exception::what 定义。


现在,根据标准,这个非虚拟调用的 std::exception::what 应该返回什么? (由我注释):

[exception]

7 Returns: An implementation-defined NTBS. (null terminated string)

显然,不需要特别打印任何内容,例如打印传递给包含 this 作为子对象的派生类的构造函数的字符串。任何字符串都符合标准。


行为的最小示例,不涉及异常:

#include <iostream>

struct A {
virtual void x() {
std::cout << "A\n";
}
};

struct B : A {
void x() {
std::cout << "B\n";
}
};

struct C : B {
using A::x;
};

int main() {
C c;
c.x();
c.C::x();
return 0;
}

两行的输出必须不同。

关于c++ - 使用间接父类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45611464/

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