只是想要一些澄清。 抽象基类是否应该没有私有成员?例如
class abc{
public:
virtual void foo()=0;
private:
int myInt;
}
你永远无法访问myInt,因为你无法创建一个abc实例,因为它是私有的,它不会在派生类中。 是否有任何情况你会在抽象基类中使用私有成员,或者这只是错误的?
答案 0 :(得分:13)
在C ++中,您可以拥有一个具有非纯虚方法的抽象类。在这种情况下,根据设计,拥有私人成员是有意义的:
class base {
std::string name;
public:
base( std::string const & n ) : name(n) {}
std::string const & getName() const { return name; }
virtual void foo() = 0;
};
该代码确保从base派生的每个对象都有一个名称,该名称在构造期间设置,并且在对象的生命周期内永远不会更改。
编辑:在Charles Bailey在answer
中提醒我之后完成您还可以定义纯虚拟函数,在这种情况下,私有属性也可以有意义:
// with the above definition of base
void base::foo() {
std::cout << "My name is " << name << std::endl;
}
答案 1 :(得分:2)
通常不建议在抽象类中使用数据成员,但是您的示例在技术上没有任何错误。在foo
的实施中,可以公开访问,您可以将myInt
用于任何您喜欢的目的。
例如:
class abc{
public:
virtual void foo()=0;
private:
int myInt;
};
class xyz : public abc
{
virtual void foo();
};
#include <iostream>
#include <ostream>
void xyz::foo()
{
std::cout << "xyz::foo()\n";
abc::foo();
}
void abc::foo()
{
std::cout << "abc::foo(): " << myInt++ << '\n';
}
#include <memory>
int main()
{
std::auto_ptr<abc> p( new xyz() ); // value-initialization important
p->foo();
p->foo();
}
输出:
xyz::foo()
abc::foo(): 0
xyz::foo()
abc::foo(): 1
答案 2 :(得分:1)
并非抽象基类中的所有方法都必须是纯虚拟的。您可能有一些对所有子类都有用的方法。因此,如果您在基类中有一些正在修改内部状态的功能,那么您将拥有私有成员。
答案 3 :(得分:1)
如果您使用Template Method design pattern(实现open/closed principle),那么拥有抽象基类的private
成员是很常见的。
答案 4 :(得分:0)
就目前而言,你的例子毫无意义。
但是,允许抽象基类具有成员函数定义,而这些定义又允许访问基类中的私有成员数据。
答案 5 :(得分:-5)
您可以通过此快捷方式访问私人会员
代码在PHP中
abstract class myclass1
{
private $var="46789";
public function test($valuetoset)
{
echo $this->var = $valuetoset;
}
}
class myclass2 extends myclass1
{
}
$obj = new myclass2();
$obj->test(78);