gpt4 book ai didi

c++ - 是否有任何关键字可以在模板化派生类中重新定义模板化基类的 "all"方法?

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

我知道这看起来是个愚蠢的问题,但是在 C++ 中使用带有模板的面向对象的东西真的很麻烦。例如,Foo 是基类:

template <typename T>
class Foo {
public:
virtual void Method1() { }
virtual void Method1(int a) { }
virtual void Method2() { }
virtual void Method2(int a) { }
//... lots of other methods
};

是否有类似的东西:

template <typename T>
class Bar : public Foo<T> {
public:
using Foo<T>::*; //redefine all inherited methods from Foo
virtual void Method1(int a) { }
virtual void Method2(int a) { }
//other methods overloading..
};

代替:

template <typename T>
class Bar : public Foo<T> {
public:
using Foo<T>::Method1
using Foo<T>::Method2
//... lots of other methods

virtual void Method1(int a) { }
virtual void Method2(int a) { }
//other methods overloading..
};

所以我们可以这样做:

int main() {
Bar<int> b;
b.Method1();
b.Method2();
//... lots of other methods

//This obviously works without the 'using' keyword:
Foo<int>* f = &b;
f->Method1();
f->Method2();
//etc
return 0;
}

最佳答案

不,没有这样的功能,但通常不需要。您打算使用 using 执行的操作已由基本继承机制提供。

如果派生类中的重载隐藏了基类中的方法,或者如果您想更改访问模式,则您需要使用using,但一般情况下不会:

class A {
void f() {}
public:
void g(int) {}
void h(int) {}
};

struct B : A {
using A::f; // make f public
void g(double) {}
using A::g; // otherwise A::g is hidden by the overload
// using A::h isn't needed
};

请注意,您仍然可以通过 B 实例调用 A::h(),因为没有隐藏它。

关于c++ - 是否有任何关键字可以在模板化派生类中重新定义模板化基类的 "all"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293270/

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