[英]C++ abstract class inheritance virtual function
I have an abstract base class with some attributes or member elements and some public functions and a public pure virtual functions. 我有一个抽象基类,其中包含一些属性或成员元素以及一些公共函数和公共纯虚函数。 In the derived class of the abstract class, I want to (a) access the members of the abstract base class as private members and (b) the public functions and defined pure virtual functions stay as public. 在抽象类的派生类中,我想(a)以私有成员的身份访问抽象基类的成员,并且(b)公共函数和定义的纯虚函数保持为公共状态。 Is there a way to do it? 有办法吗? That is., what should be the xxxx of AbstractBase and yyyy access specifier in the derived to realize this? 也就是说,派生类中的AbstractBase和yyyy访问说明符的xxxx应该是什么?
#include <iostream>
class AbstractBase {
xxxx: <-- // protected/private/public?
std::string baseprivate1;
public:
virtual void set_privates() = 0;
void print() { std::cout << baseprivate1 << std::endl; }
void foo() { // some definition here }
};
class Derived : yyyy AbstractBase { <--- //public/protected/private?
private:
std::string derivedprivate1;
public:
void set_privates() {
// I want this baseprivate1 to be private in derived class as well.
// When I choose xxxx as protected and yyyy as public, the baseprivate1 is protected.
this->baseprivate1 = "Base private1";
this->derivedprivate1 = "Derived private1";
}
void print() {
AbstractBase::print();
std::cout << this->derivedprivate1;
}
// When I choose xxxx as protected and yyyy as protected
// foo becomes protected and unable to call from outside
// I want the foo of abstract base to be public here as well.
};
int main(int argc, char *argv[]){
Derived d;
d.set_privates();
d.print();
d.foo(); // I should be able to call foo of abstract base class
}
It can be confused as duplicate of Difference between private, public, and protected inheritance . 可以将其混淆为私有继承,公共继承和受保护继承之间的差异的重复。 If you keep xxxx as protected and yyyy as public, then baseprivate1 will be protected in Derived and is not private anymore. 如果您将xxxx设置为受保护而yyyy设置为公共,则baseprivate1将在“派生”中受到保护,并且不再是私有的。 Alternatively, if xxxx is public/protected and yyyy is private, the functions in derived becomes private. 或者,如果xxxx为public / protected,而yyyy为private,则派生函数将变为private。
One way to acomplish what you want would be to use private inheritance of AbstractBase on your Derived class. 完成所需内容的一种方法是在Derived类上使用AbstractBase的私有继承。 You can then expose some of AbstractBase's methods with a using-declaration under a public access specifier in the Derived class. 然后,您可以在Derived类中的公共访问说明符下使用using声明来公开AbstractBase的一些方法。
#include <iostream>
class AbstractBase {
public:
std::string baseprivate1;
virtual void set_privates() = 0;
void print() { std::cout << baseprivate1 << std::endl; }
void foo() { /* some definition here */ }
};
class Derived : private AbstractBase { // use private inheritance on AbstractBase
private:
std::string derivedprivate1;
public:
// expose AbstractBase's methods with using-declarations
using AbstractBase::foo;
using AbstractBase::print;
void set_privates() {
this->baseprivate1 = "Base private1";
this->derivedprivate1 = "Derived private1";
}
void print() {
AbstractBase::print();
std::cout << this->derivedprivate1 << std::endl;;
}
};
int main(int argc, char *argv[]){
Derived d;
d.set_privates();
d.print();
d.foo();
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.