gpt4 book ai didi

c++ - 如何正确隐藏方法

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:46 24 4
gpt4 key购买 nike

考虑以下几点:

struct A {
void f() { g(); }
private:
void g() {std::cout << "A.g" << std::endl;}
};

struct B: A {
// Inherited f from A, but I want f to call B.g this time.
private:
void g() {std::cout << "B.g" << std::endl;}
};

int main() {
B{}.f();
return 0;
}

这个程序的输出是A.g。有没有办法让它输出 B.g 而不使 g 虚拟?

最佳答案

如果您需要使用 virtual 避免运行时多态性,我认为事情必须变得更冗长一些。

基本解决方案是在B中简单地重复f()的定义:

struct A {
void f() { g(); }
private:
void g() {std::cout << "A.g" << std::endl;}
};

struct B: A {
void f() { g(); } // will bind to B.g in this context
private:
void g() {std::cout << "B.g" << std::endl;}
};

但从软件工程的角度和 DRY 原则来看,这可能是不可取的。如果 f() 中除了调用 g() 之外还有一些功能,您的代码中将有该功能的两个拷贝,这是不好的。

在大多数情况下,您可以通过使用模板来避免多态性,但代码会变得有点难看。这是一种方法,其中成员函数 g() 被放入结构中,原始 f() 被制成模板成员函数,并且有为方便起见,f() 的简单重复定义:

class A {
private:
struct G {
void operator()() { std::cout << "A.g" << std::endl; }
};
protected:
template <typename gfun> void ffun() {
gfun()();
/* (maybe some other common functionality in here too) */
}
public:
void f() { ffun<G>(); }
};

class B :public A {
private:
struct G {
void operator()() { std::cout << "B.g" << std::endl; }
};
public:
void f() { ffun<G>(); }
};

int main() {
A a;
a.f(); // prints "A.g"
B b;
b.f(); // prints "B.g"
return 0;
}

关于c++ - 如何正确隐藏方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38125071/

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