14

只是想澄清一下。抽象基类不应该有私有成员吗?例如

class abc{
public:
  virtual void foo()=0;
private:
  int myInt;
}

您永远无法访问 myInt,因为您无法创建 abc 的实例,并且它不会在派生类中,因为它是私有的。有没有在抽象基类中使用私有成员的情况,或者这只是错误的?

4

6 回答 6

16

在 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 派生的每个对象都有一个名称,该名称在构造期间设置,并且在对象的生命周期内永远不会更改。

编辑:在查尔斯贝利在他的回答中提醒我之后完成

您还可以定义纯虚拟函数,在这种情况下,私有属性也可能有意义:

// with the above definition of base
void base::foo() {
   std::cout << "My name is " << name << std::endl;
}
于 2011-04-06T15:44:45.727 回答
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
于 2011-04-06T15:56:42.393 回答
1

并非抽象基类中的所有方法都必须是纯虚拟的。您可能有一些对所有子类都有用的方法。因此,如果您在基类中有一些正在修改内部状态的功能,那么您将拥有这些功能的私有成员。

于 2011-04-06T15:45:06.283 回答
1

如果您使用模板方法设计模式(实现开/关原则private),那么拥有抽象基类的成员是很常见的。

于 2011-04-06T16:02:45.457 回答
0

就目前而言,您的示例毫无意义。

但是,抽象基类可以有成员函数定义,而这些定义又可以访问基类中的私有成员数据。

于 2011-04-06T15:44:45.917 回答
-7

您可以通过这种快捷方式访问私人会员

代码是 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);
于 2011-07-08T12:44:34.810 回答