这是使用继承的好方法吗?
#include <iostream>
namespace Test::A {
class A {
char const * const this_message;
public:
constexpr A(char const * const message) noexcept
: this_message(message) {
}
constexpr char const * message() const noexcept {
return this_message;
}
};
struct B : public A {
constexpr B(char const * const message) noexcept
: A(message) {
}
};
}
int main() {
std::cout << sizeof(Test::A::A) << '\n';
std::cout << sizeof(Test::A::B) << '\n';
std::cout << Test::A::B("Test 1").message() << '\n';
try {
char const * const Test4 = "Test 4";
// Uncomment / comment to toggle between
//throw Test::A::B("Test 1");
throw Test::A::B(Test4);
} catch (Test::A::A const a) {
// I'm passing 'a' by copy because the size of 'a'
// will always be either 4 or 8 bytes / it's faster this way.
constexpr auto message = Test::A::B("Test 3").message();
std::cout << a.message() << " " << message << '\n';
}
return 0;
}
我有2个问题:
A)这是使用继承和...的好方法吗?
B)该程序正确,结构正确且没有不确定的行为吗?
我想创建自己的简单两级异常层次结构(仅一个基类和一些派生类),并且我试图找到一种无需任何虚拟方法的实现方式。
以下代码可以正常工作,即使在派生类上没有要析构的东西,它也似乎以正确的顺序调用了析构函数。但是,我对此工作的内部原理感到困惑。
我知道如果我希望通过其基指针删除派生类,则需要一个虚拟析构函数,但是我没有考虑支持这种多态性。
我知道,通过从
message
调用B
方法,我只是从A
调用该方法,该方法又返回了成员变量this_message
,可以在A
或B
中对其进行初始化。将对象传递给catch调用时,是否通过 slice 过程将
B
对象转换为A
?但是因为B只是初始化了A
的成员/与A
具有相同的状态,所以最后都可以解决。这个想法是通过传递一个包含行号,文件位置等的静态char数组在一个宏中初始化
A
类及其派生类。 最佳答案
如果您是唯一一个从事项目工作的程序员,则这种折衷方案可能是切实可行的,但是您需要与加入该项目的每个人进行沟通和强制执行这些折衷方案,因此您很难扩展或重用该项目。您编写的代码。
是的,通过 slice 。是的,它卡在一起。
那是另一个问题/陷阱:人们习惯于用std::exception
捕获内部std::string
中的文本,因此必须警告其他程序员不要执行Test::A::B(my_message_in_a_string.c_str());
和Test::A::B(my_ostringstream.str())
之类的操作,这使得将有用的消息放入异常类中变得非常困难。 。
它为您提供了按基(无论是按引用还是 slice )或派生类型进行捕获的选项,因此继承可添加有用的功能。
确实如此,但是由于缺乏虚拟功能和使用 slice ,它在维护时非常脆弱并且很难扩展。
关于c++ - 这是使用继承的好方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48957007/