Skip to content

Instantly share code, notes, and snippets.

@jkomyno
Created January 1, 2018 20:55
Show Gist options
  • Save jkomyno/9b6d369a61b74755889517e6e3be30e4 to your computer and use it in GitHub Desktop.
Save jkomyno/9b6d369a61b74755889517e6e3be30e4 to your computer and use it in GitHub Desktop.
OOP c++ virtual
#include <vector>
#include <iostream>
class A {
private:
std::vector<int> data_;
public:
A()
{
std::cout << "A()" << std::endl;
}
A(const std::vector<int>& data) :
data_(data)
{
std::cout << "A(data)" << std::endl;
}
std::vector<int> GetData() const {
return this->data_;
}
};
class B : public A {
private:
int number_1_;
int number_2_;
public:
B()
{
std::cout << "B()" << std::endl;
}
B(int number_1, int number_2, const std::vector<int>& data) :
number_1_(number_1),
number_2_(number_2),
A(data)
{
std::cout << "B(number_1, number_2, data)" << std::endl;
}
int GetN1() const {
return number_1_;
}
int GetN2() const {
return number_2_;
}
};
class C : virtual public B {
private:
C(int number, const std::vector<int>& data) :
B(number, number, data)
{
std::cout << "C(number, data)" << std::endl;
}
public:
C()
{
std::cout << "C()" << std::endl;
}
C(const std::vector<int>& data) :
C(data.size(), data)
{
std::cout << "C(data)" << std::endl;
}
};
class D : public C {
private:
D(int number, const std::vector<int>& data) :
B(number, number, data)
{
std::cout << "D(number, data)" << std::endl;
}
public:
D(const std::vector<int>& data) :
D(data.size(), data)
{
std::cout << "D(data)" << std::endl;
}
};
int main() {
D d({1,2,3,4});
std::cout << "d.GetData().size() " << d.GetData().size() << std::endl; // 4
std::cout << "d.GetN1() " << d.GetN1() << std::endl; // 4
std::cout << "d.GetN2() " << d.GetN2() << std::endl; // 4
return 0;
}
#include <vector>
#include <iostream>
class A {
private:
std::vector<int> data_;
public:
A()
{
std::cout << "A()" << std::endl;
}
A(const std::vector<int>& data) :
data_(data)
{
std::cout << "A(data)" << std::endl;
}
std::vector<int> GetData() const {
return this->data_;
}
};
class B : public A {
private:
int number_1_;
int number_2_;
public:
B()
{
std::cout << "B()" << std::endl;
}
B(int number_1, int number_2, const std::vector<int>& data) :
number_1_(number_1),
number_2_(number_2),
A(data)
{
std::cout << "B(number_1, number_2, data)" << std::endl;
}
int GetN1() const {
return number_1_;
}
int GetN2() const {
return number_2_;
}
};
class C : virtual public B {
private:
C(int number, const std::vector<int>& data) :
B(number, number, data)
{
std::cout << "C(number, data)" << std::endl;
}
public:
C()
{
std::cout << "C()" << std::endl;
}
C(const std::vector<int>& data) :
C(data.size(), data)
{
std::cout << "C(data)" << std::endl;
}
};
class D : public C {
public:
D(const std::vector<int>& data) :
C(data)
{
std::cout << "D(data)" << std::endl;
}
};
int main() {
D d({1,2,3,4});
std::cout << "d.GetData().size() " << d.GetData().size() << std::endl; // 0
std::cout << "d.GetN1() " << d.GetN1() << std::endl; // undefined
std::cout << "d.GetN2() " << d.GetN2() << std::endl; // undefined
return 0;
}
#include <vector>
#include <iostream>
class A {
private:
std::vector<int> data_;
public:
A()
{
std::cout << "A()" << std::endl;
}
A(const std::vector<int>& data) :
data_(data)
{
std::cout << "A(data)" << std::endl;
}
std::vector<int> GetData() const {
return this->data_;
}
};
class B : public A {
private:
int number_1_;
int number_2_;
public:
B()
{
std::cout << "B()" << std::endl;
}
B(int number_1, int number_2, const std::vector<int>& data) :
number_1_(number_1),
number_2_(number_2),
A(data)
{
std::cout << "B(number_1, number_2, data)" << std::endl;
}
int GetN1() const {
return number_1_;
}
int GetN2() const {
return number_2_;
}
};
class C : virtual public B {
private:
C(int number, const std::vector<int>& data) :
B(number, number, data)
{
std::cout << "C(number, data)" << std::endl;
}
public:
C()
{
std::cout << "C()" << std::endl;
}
C(const std::vector<int>& data) :
C(data.size(), data)
{
std::cout << "C(data)" << std::endl;
}
};
class D : public C {
+ private:
+ D(int number, const std::vector<int>& data) :
+ B(number, number, data)
+ {
+ std::cout << "D(number, data)" << std::endl;
+ }
public:
D(const std::vector<int>& data) :
- C(data)
+ D(data.size(), data)
{
std::cout << "D(data)" << std::endl;
}
};
int main() {
D d({1,2,3,4});
std::cout << "d.GetData().size() " << d.GetData().size() << std::endl; // 4
std::cout << "d.GetN1() " << d.GetN1() << std::endl; // 4
std::cout << "d.GetN2() " << d.GetN2() << std::endl; // 4
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment