c++抽象基类的私有成员
c++ abstract base class private members
只是想澄清一下。抽象基类不应该有私有成员吗?例如
class abc{
public:
virtual void foo()=0;
private:
int myInt;
}
你永远不能访问myInt,因为你不能创建abc的实例,而且它不会在派生类中,因为它是私有的。是否存在在抽象基类中使用私有成员的情况,或者这是错误的?
在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派生的每个对象都有一个名称,该名称在构造期间设置,并且在对象的生命周期内永远不会更改。
EDIT:在Charles Bailey在他的回答中提醒我之后完成
还可以定义纯虚函数,在这种情况下,私有属性也有意义:
// with the above definition of base
void base::foo() {
std::cout << "My name is " << name << std::endl;
}
通常不建议在抽象类中包含数据成员,但您的示例在技术上没有任何问题。在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
并非抽象基类中的所有方法都必须是纯虚方法。你可能有一些对所有子类都有用的方法。因此,如果你在基类中有一些修改内部状态的功能,你就会有这些私有成员。
如果您使用模板方法设计模式(实现开/闭原则),那么在抽象基类中使用private
成员是很常见的。
就目前情况来看,你的例子毫无意义。
但是,抽象基类允许具有成员函数定义,从而允许成员函数定义访问基类中的私有成员数据。
您可以通过此快捷方式访问私有成员
代码为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);
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- C++从抽象类型定义类成员
- C++ 将一组对象传递给抽象类的成员函数
- 在 C++ 中访问抽象类成员中的类
- 复制构造抽象类型的数据成员
- 我应该初始化抽象类的成员吗?
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- 如何在c++中实现内部抽象成员类
- 返回虚拟函数的静态成员,对于抽象类缺少VT
- C++:具有成员的抽象类中的纯虚拟析构函数
- 抽象类成员变量
- 具有数据成员、构造函数和运算符重载的抽象基类
- 在抽象基类中与抽象类成员合作的最佳方法
- 我可以覆盖一个抽象基类的成员吗
- 基于模板的成员初始化,其中模板是抽象类的派生
- C++中抽象成员和类函数指针的深层复制构造函数
- 带有抽象类的unique_ptr成员和Copy构造函数的Factory方法模式
- 增强引用成员抽象类的序列化