我正在学习多态,我熟悉php。
我从https://stackoverflow.com/a/749738/80353看到了这个优秀的例子。转载如下。
如何编写相同的代码,但在C ++中?
我自己写一个问题,因为我相信(我可能错了)C ++中的数据结构是严格的。
您必须在C ++中使用相同类型的链表或数组中的所有元素。
所以我相信你需要将猫和狗作为他们的基类存储到数据结构中。
那么我如何将这个PHP代码片段写入一个C ++代码片段,该代码片段使用严格的数据结构,它只能存储1种数据类型的元素?
class Animal {
var $name;
function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
function speak() {
return "Woof, woof!";
}
}
class Cat extends Animal {
function speak() {
return "Meow...";
}
}
$animals = array(new Dog('Skip'), new Cat('Snowball'));
foreach($animals as $animal) {
print $animal->name . " says: " . $animal->speak() . '<br>';
}
答案 0 :(得分:0)
好吧,您可以使用带有抽象类的指针,使用纯虚方法,如下所示:
class Polygon {
public:
virtual void setValue(int k) = 0; // Declaring our pure virtual method.
};
class Rect : public Polygon {
public:
virtual void setValue(int k); = 0; // Declaring the pure virtual method again.
};
Rect::setValue(int k) { // You must create a setValue() method for every class, since we made a pure virtual method. This is the Polymorphic part.
// Code in here that setValue() method executes.
int foo = a;
std::cout << foo << std::endl;
}
现在您可以访问声明对象指针的方法。
int main() {
Polygon* pSomePolygon = nullptr; // Assuming using C++11.
Rect* pRect = new Rect; // Declare our object.
pSomePolygon = pRect; // Point our pointer to object 'pRect'.
pSomePolygon->setValue(18); // Pointer accesses pRect and uses the pure virtual method.
delete pRect; // Clean up!
return 0;
}
答案 1 :(得分:0)
由于您只询问了存储它们,因此我将省略Animal
,Dog
和Cat
的实施。
vector< shared_ptr<Animal> > animals;
animals.push_back( new Dog("Skip") );
animals.push_back( new Cat("Snowball") );
for( size_t i = 0; i< animals.size(); ++i )
cout << animals[i]->name << " says: " << animals[i]->speak() << endl;
基本上你需要存储指向对象的指针。简而言之,shared_ptr<T>
是一个存储指针的类,并在不再引用时删除它。
答案 2 :(得分:0)
作为不熟悉C ++的人,请创建一个index.cpp文件并使用以下内容填充
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Animal {
public:
std::string name;
Animal (const std::string& givenName) : name(givenName) {}
virtual string speak () = 0;
virtual ~Animal() {}
};
class Dog: public Animal {
public:
Dog (const std::string& givenName) : Animal (givenName) {
}
string speak ()
{ return "Woof, woof!"; }
};
class Cat: public Animal {
public:
Cat (const std::string& givenName) : Animal (givenName) {
}
string speak ()
{ return "Meow..."; }
};
int main() {
std::vector<std::unique_ptr<Animal>> animals;
animals.push_back( std::unique_ptr<Animal>(new Dog("Skip")) );
animals.push_back( std::unique_ptr<Animal>(new Cat("Snowball")) );
for( int i = 0; i< animals.size(); ++i ) {
cout << animals[i]->name << " says: " << animals[i]->speak() << endl;
}
}
然后,使用以下命令编译index.cpp文件
c++ index.cpp -std=c++11 -stdlib=libc++
你需要这样做,因为在代码中使用了智能指针unique_ptr。
最后你可以执行编译的可执行输出文件,该文件应该是a.out
./a.out