gpt4 book ai didi

c++ - 在 C++ 的派生类中对基类方法(构造函数除外)进行别名的简单方法

转载 作者:行者123 更新时间:2023-12-05 05:43:53 24 4
gpt4 key购买 nike

我想在 C++ 的派生方法中为基类的方法添加别名——即仅更改名称,而不更改签名。

该方法的名称在其原始作用域(在基类中)足够清晰,但在派生类中变得模棱两可或具有误导性。因此,明显的缓解措施是为基类中的方法创建一个别名。但是,随着派生类的改进和重新测试,该方法采用的一长串参数在不断变化。我想避免重新键入方法签名的样板数据输入任务,并以更简单的方式为其添加别名,就像我可以为继承的专用构造函数使用“using”指令一样。

简单的例子:

struct Person {
int ID;
void virtual sit() {};
void virtual walk() {};
void virtual run(int speed, int duration, int stride) {}; //method name in unambiguous in this scope

Person(int id) : ID(id) {} //specialized c'tor
};

struct Politician : Person {
void speak() {};
void campaign() {}; //use this to 'run' for office
//'sit' and 'walk' are clear enough, but 'run' is ambiguous in this scope, so alias it to 'sprint'
void sprint(int speed, int duration, int stride) {
Person::run(speed, duration, stride);
} //the above works, but is a boat-load of boilerplate that I'd like to avoid

using Person::Person; //use Person c'tor (avoids boilerplate)
//using sprint = Person::run; //doesn't work - "'run' in 'struct Person' does not name a type"
};

(还要考虑一个从多个基类继承的虚拟类,具有一个或多个同名基类方法。这就是我的真实世界应用程序,我将其归结为这个更简单的根需求示例。)

肯定有更简单的方法为未更改的继承方法创建别名,对吧?

最佳答案

你要求的答案

template <typename ...T>
decltype(auto) wrapper(T... t)
{
return func_whos_sig_keeps_changing(t...);
}

你需要的答案

您要么违反了继承背后的主要原则,要么还没有想清楚您打算如何使用它。

从 person 继承的全部意义在于,您可以在代码的某处拥有:

std::unique_ptr<person> person_ptr;
...
...
person_ptr->run();

不关心他到底是什么类型的人。
如果你不能对政治家这样做,那么它就不是一个人,也不应该从人那里继承,至少不应该公开。

关于c++ - 在 C++ 的派生类中对基类方法(构造函数除外)进行别名的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71720913/

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